百变鹏仔-专注前端行业精选
当前位置:网站首页 > 最近更新 > 前端开发 > 面试题 > 正文

什么是闭包(closure)为什么要用它?

作者:鹏仔先生日期:2020-06-01 16:32:49浏览:1318分类:面试题

闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部。


闭包的特性:
1.函数内再嵌套函数
2.内部函数可以引用外层的参数和变量
3.参数和变量不会被垃圾回收机制回收
例如://li节点的onclick事件都能正确的弹出当前被点击的li索引

<ul id="testUL">
    <li> index = 0</li>
    <li> index = 1</li>
    <li> index = 2</li>
    <li> index = 3</li>
</ul>
<script type="text/javascript">
    var nodes = document.getElementsByTagName("li");
    for(i = 0;i<nodes.length;i+= 1){
        nodes[i].onclick = (function(i){
                  return function() {
                     console.log(i);
                  } //不用闭包的话,值每次都是4
                })(i);
    }
</script>


执行say667()后,say667()闭包内部变量会存在,而闭包内部函数的内部变量不会存在
使得Javascript的垃圾回收机制GC不会收回say667()所占用的资源
因为say667()的内部函数的执行需要依赖say667()中的变量
这是对闭包作用的非常直白的描述

<script>
	function say667() {
	    // Local variable that ends up within closure
	    var num = 666;
	    var sayAlert = function() {
	        alert(num);
	    }
	    num++;
	    return sayAlert;
	}
	 var sayAlert = say667();
	 sayAlert()//执行结果应该弹出的667
</script>


你知道哪些针对jQuery的优化方法
基于Class的选择性的性能相对于Id选择器开销很大,因为需遍历所有DOM元素。
频繁操作的DOM,先缓存起来再操作。用Jquery的链式调用更好。
   比如:var str=$("a").attr("href");
   for (var i = size; i < arr.length; i++) {}
   for 循环每一次循环都查找了数组 (arr) 的.length 属性,在开始循环的时候设置一个变量来存储这个数字,可以让循环跑得更快:
   for (var i = size, length = arr.length; i < length; i++) {}


手机扫码访问

暂无评论,来添加一个吧。

取消回复欢迎 发表评论:

关灯