对象文字方法的范围

时间:2014-10-19 05:17:16

标签: javascript scoping

我目前正在做一些关于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();

3 个答案:

答案 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.methodfnc必须提供相同的结果。