4、ar o = {x: "o's x", f: f}; 15.o.f(); // "o's x" 上文提到,在function被执行时生成新的上下文时会先绑定当前上下文的变量对象,再创建作用域链。我们知道function的定义是可以嵌套在其他function所创建的上下文中,也可以并列地定义在同一个上下文中(如global)。作用域链实际上就是自下而上地将所有嵌套定义的上下文所绑定的变量对象串接到一起,使嵌套的function可以“继承”上层上下文的变量,而并列的function之间互不干扰:1.var x = 'global'; 2.function a(){ 3. var x = "a's
5、 x"; 4. function b(){ 5. var y = "b's y"; 6. console.log(x); 7. }; 8. b(); 9.} 10.function c(){ 11. var x = "c's x"; 12. function d(){ 13. console.log(y); 14. }; 15. d(); 16.} 17.a(); // -> "a's x" 18.c(); // -> ReferenceError: y is not defined 19.x // -> "global" 20.y // -
6、> ReferenceError: y is not defined Closure如果理解了上文中提到的上下文与作用域链的机制,再来看闭包的概念就很清楚了。每个function在调用时会创建新的上下文及作用域链,而作用域链就是将外层(上层)上下文所绑定的变量对象逐一串连起来,使当前function可以获取外层上下文的变量、数据等。如果我们在function中定义新的function,同时将内层function作为值返回,那么内层function所包含的作用域链将会一起返回,即使内层function在其他上下文中执行,其内部的作用域链仍然保持着原有的数据,而当前的上下文可能无法获取原先外层fu
7、nction中的数据,使得function内部的作用域链被保护起来,从而形成“闭包”。看下面的例子:1.var x = 100; 2.var inc = function(){ 3. var x = 0; 4. return function(){ 5. console.log(x++); 6. }; 7.}; 8. 9.var inc1 = inc(); 10.var inc2 =