我目前正在做一些关于JS中的范围和提升的实验。我有两个例子让我以不同的方式让我感到困惑。首先,我已经为一个名为parent的变量分配了一个匿名函数。显然,返回的子函数可以访问它外部函数范围,因此它可以访问文本变量。它清晰易懂。这是代码..
var parent = function() {
var text = 'i can access the container';
return function() {
alert(text);
}
}();
parent();
后来我想要返回一个对象而不是一个有一个方法的函数。这个方法不直接在立即调用函数的主体中,而是在返回的对象内部定义。但它可以访问名为private的变量它包含一个字符串值。这个变量是否在这个对象文字方法的范围内?
var parent = (function() {
var text = 'private variable';
return {
prop: 'i am the property',
method: function() {
alert('i can access ' + text);
}
}
})();
parent.method();
答案 0 :(得分:4)
在JavaScript中,对象文字不会创建新范围,只会创建功能。因此,IIFE中声明的所有变量都可用于对象文字中的method
函数。
答案 1 :(得分:1)
对象文字可以看到在其定义的函数的块范围中定义的任何内容。
答案 2 :(得分:1)
这就是闭包的用途。
你的第二个例子可以改写为:
var parent=(function(){
var text='private variable',
fnc = function(){
alert('i can access ' +text);
};
return {
prop:'i am the property',
method: fnc
}
})();
parent.method();
或者:
var text='private variable',
fnc = function(){
alert('i can access ' +text);
};
var parent=(function(){
return {
prop:'i am the property',
method: fnc
}
})();
parent.method();
显而易见,调用parent.method
或fnc
必须提供相同的结果。