每次面试,做笔试题,这都是糊里糊涂,答不明白,而且在面试前,人家特意复习了好吗?!
人家一问,我的脑子就不见了。
首先再复习一下作用域,就提两个知识点:
1:函数内部可以直接读取全局变量;
2:在函数的外部无法获取函数内的局部变量。
那么如何才能从外部获取局部变量?那就是在函数内部再定义一个函数。类似于这样:
1 function f1{ 2 var n=999; 3 function f2{ 4 alert(n); // 999 5 } 6 }
函数 f2 包在函数 f1 里面,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
1 function f1{ 2 var n=999; 3 function f2{ 4 alert(n); 5 } 6 return f2; 7 } 8 var result=f1; 9 result; // 999
在上面这个函数里 f2 就是一个闭包。
这样感觉清晰多了。去做几道练习题!
感谢阮一峰的网络日志,原文链接:http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html