扫码关注公众号
有以下函数,这3个函数中哪个能够访问外部范围变量?
clickHandler能够从外部作用域访问变量countClicks。immediate无法访问外部作用域中的任何变量。delayedReload从全局作用域(也就是最外层作用域)中访问全局变量location。
闭包的缺点
优点也是缺点,本应被销毁的变量,因为闭包的原因没有被销毁,长期存在的话,容易造成内存泄漏注意点:(1)合理使用闭包(2)用完闭包要及时清除(销毁),避免内存泄露
分析输出是什么
10解析:这道题中首先执行test(),这个函数中进行了十次循环,每次循环都往数组num中新增一个function(这个function这里还没有执行,只是把函数的定义作为数组元素扔进去),最后返回下标为9的这个function。所以,这里通过使用函数作为返回值的形式,形成了一个闭包。接着,test()()执行的是nums[9]这个function,也就是for循环中的这个function,把他拎出来:function(){console.log(i)}这个函数要打印i的值,但是这个函数中本身并没有定义i这个变量,所以变量i是一个自由变量。自由变量的查找,是要到函数定义的地方,沿着作用域链向上级查找(这一点在搞懂JavaScript的作用域、作用域链、闭包这篇文章中讲过)。于是,就找到了test()这个函数的作用域。这个作用域中定义了变量i。当我执行打印i的操作时,for循环早就已经执行完毕了,i的值已经变成了10,所以此时找到的i,它的值就是10。所以,这道题的输出结果就是10。
创建匿名函数表达式
创建一个变量,这个变量的内容为一个函数varfn1=function(){}注意采用这种方法创建的函数为匿名函数,即没有函数namevarfn1=function(){};getFunctionName(fn1).length;//0