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()没有引用局部变量时,其将像普通局部变量一样进行回收。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值