Abruzzi's Wall

Front-End Web Developer

Ghost only can help me to here...


JS闭包中的引用

今天读《Effective Javascript》第14条感觉很有意思,以前并不知道这个情况,因此记录下来。

先上Bug代码

初看这段代码输出的值大概会想到是10,但实际输出undefined

这是因为对于闭包函数,即上面代码中
function() {return a[i];}
它所引用的变量i来自外部函数,而闭包函数的一大特点是:通过引用而非值来捕获外部变量,因此这里a[i]中的i仅仅是对外部函数i的一个引用。

因此wrapped[0]时,闭包函数外所驻留的变量i此时值为5,因此调用所有闭包函数都会return a[5],结果自然就是undefined了。

解决这个坑的方法是创建一个嵌套函数的局部作用域,将a[x]x绑定为值:

可以看到在闭包外的局部作用域中j以值的形式添加给了数组a

通过立即调用函数表达式(IIFE)可以建立局部作用域,但同时也有2个隐患:

1.立即调用函数表达式代码块中不能有breakcontinue
2.如果代码块中引用了this或者特别的arguments变量,IIFE可能会改变他们的含义。