本文主要是介绍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.闭包会内部存储用到的外部变量引用,并且能够读写它存储的变量。
这篇关于Get Comfortable with Closures的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!