Get Comfortable with Closures

本文意译自 高效javascript 之本文标题,其言简意骇。

理解javascript闭包 ,仅需要认清三个必要事实

事实一:javascript 允许引用当前函数外部定义的变量

 示例:

function makeSandwich(){
    var magicIngredient = "peanut butter";
    function make(filling){
        return magicIngredient + " and " + filling;
    }
    return make("jelly");
}
 makeSandwich();

注意:内层函数make 引用了一个定义在外层函数 makeSandwich内的变量 magicIngredient


 事实二: 即使是在外层函数调用结束之后,内层函数仍然能够引用定义在外层函数内的变量!

如此这般:意味着你可以返回一个函数,在未来的某个时候去调用它!!!

function sandwichMaker(){
    var magicIngredient = "peanut butter";
    function make(filling){
        return magicIngredient + " and " + filling;
    }
    return make;
}
var f =  sandwichMaker(); f("jelly");

注意:f 值就是内部make函数,且调用f会对调用make生效. 即使sandwichMaker函数已经调用完毕,make函数仍然能够记住外部变量magicIngredient的值。

为什么会这样?

  javascript 函数值所包含的信息 不止于在函数被调用执行时所需要的代码。它会内部存储,函数定义时所引用的任意变量。这种保持对来自作用域变量追溯的函数就是众所周知的闭包。make函数是一个闭包,它的代码引用了两个外部变量。无论何时make函数被调用,它的代码都能够引用这两个变量。这是因为它们被存储在闭包内。

js常识:一个函数能引用在它自己作用域内任意变量,包括参数和外层函数变量。


事实三:闭包可以修改外层变量的值

注意:从本质上讲,闭包存储的是外层变量的引用,而不是复制它们的值。如此这般,闭包就拥有修改外部变量的权限。

function box(){
    var val = undefined;
    return {
        set:function(newVal){val=newVal;},
        get:function(){return val;},
        type:function(){return typeof val;}
    };
}
var b = box();
b.type();//"undefined"
b.set(98.6);
b.get();
b.type(); //"number"

上述示例一个包含三个闭包属性的对象,每个闭包都有共享访问val变量,set更改,get,types查看结果。


小结:

1.函数能够引用定义在外层作用域中的变量

2.闭包比创建它的函数生命周期长

3.闭包会内部存储用到的外部变量引用,并且能够读写它存储的变量。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值