浅谈Javascript中的闭包
闭包,也是一个常规的面试问题,简单点是函数嵌套函数。
函数作为返回值:
函数(){
var a=1;
返回函数(){
++;
console.log(一);
}
}
var =美孚();
AAA();2
AAA();3
实际上,这段代码并不难理解。AAA是指向富()的一个新函数,但在这个函数中,引用一个变量。因此,当函数执行时,变量A仍然存在于内存中,即a分别为2和3。
函数作为参数:
var a=10;
函数(){
console.log(一);
}
函数AAA(FN){
var a=100;
(FN);
}
AAA(富);
根据我以前的理解,在执行AAA函数中的FN函数时,如果没有变量,则转到父范围以找到变量。这里是100。结果是100吗
不幸的是,答案是否定的。结果是10。王付鹏的博客是很好的。他说他想创建函数的作用域而不是父作用域。
闭包的使用场景
因为我也比较新手,这里是一个简单的例子。当李被点击时,李在UL中的位置是索引值。
HTML代码:
001
002
003
JS代码:
例1:
请看下面的代码,在运行之后,不管你点击了多少李,你会发现结果是3。
VaR阿里= document.getelementsbytagname(李的);
对于(var i = 0;i < ali.length;i++){
ALi {我}。onclick =函数(){
警报(一);
}
}
由于匿名函数中没有i变量,所以在结束时,我们单击页面上的LI标记,而我早在3。
例2:
ALi {我}。onclick =(功能(我){)
返回函数(){
警报(一);
}
})(一);
这一次我们使用函数作为返回值,并通过自执行函数的参数传递变量i。然后,因为返回函数必须引用i变量,当for循环结束时,它不会释放i变量,也就是说,i变量的值保存在内存中。基于这个原则,很容易导致IE的低版本内存泄漏。
例3:
对于(var i = 0;i < ali.length;i++){
(函数(i){)
ALi {我}。onclick =函数(){
警报(一);
}
})(一);
}
这个原则和上面的差不多。
小米前端关闭采访问题:
函数重复(函数,时间,等待){
此函数返回一个新函数,如使用
无功repeatedfun =重复(报警,10, 5000)
/ /电话repeatedfun(hellworld )
提醒/ HelloWorld十次,每次间隔5秒
我的回答:
函数重复(函数,时间,等待){
返回函数(STR){
当(时间> 0){
setTimeout(){()函数(
Func(STR);
},等待);
倍;
}
}
}
无功repeatedfun =重复(报警,10, 100);
repeatedfun(hellworld );
以上是本文的全部内容,我希望它能帮助您学习Javascript闭包。