JS closures


JS 闭包原理: functions are executed using the scope chain that was in effect when they were defined.(来自《JavaScript:The Definitive Guide》).

闭包形成也就是:如果一个函数返回另一个函数,而被返回函数又需要外层函数的变量时,不会立即释放这个变量,而是允许被返回的函数引用这些变量。支持这种机制的语言称为支持闭包机制,而这个内部函数连同其自由变量就形成了一个闭包

var scope = "global scope";

 function checkScope(){
    var scope = "local scope";
    function f() { return scope;}
    return f;
}
console.log(checkScope()());


当调用checkScope()();时,返回的是"local scope";也就是,调用的返回函数仍然使用的是局部变量。因为其定义时候,使用的就是局部变量,所以在返回调用时候,仍然持有对局部变量的引用。

将上面代码修改一下:

var scope = "global scope";

var c = {
    scope: "c scope"
}

 function checkScope(){
    var scope = "local scope";
    function f() { return this.scope;}
    return f;
}
console.log(checkScope()());
console.log(checkScope().call(c));  
console.log(checkScope().call(this));
打印出来的分别为: global scope c scope global scope

这里,改变了f()函数调用的变量。因而其不将再引用局部变量scope = "local scope";而是使用调用checkScope()这个函数的对象的scope变量。也就是f()没有引用局部变量时,其将像普通局部变量一样进行回收。








你可能感兴趣的:(closure)