函数内部可以直接读取全局变量
var n=999; function f1(){ alert(n); } f1(); // 999
函数外部无法读取函数内的局部变量
function f1(){ var n=999; } alert(n); // error
函数内部声明变量的时候,一定要使用var或this命令。如果不用的话,实际上声明了一个全局变量
function f1(){ n=999; } f1(); alert(n); // 999
从外部读取局部变量,在函数的内部,再定义一个函数
function f1(){ var n=999; function f2(){ alert(n); // 999 } }
链式作用域:子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
把f2作为返回值,就可以在f1外部读取它的内部变量了
function f1(){ var n=999; function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999
f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收
思考:
代码一
var name = "window"; var obj = { name : "myobject", getNameFunc : function(){ return function(){ return this.name; } } } alert(obj.getNameFunc()());
代码二
var name = "window"; var obj = { name : "myobject", getNameFunc : function(){ var that = this; return function(){ return that.name; } } } alert(obj.getNameFunc()());
原作者: 阮一峰 http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html