2014-10-19 57 views
-1

我目前正在做关于JS中的范围和提升的一些实验。在这里我有两个以不同方式让我困惑的例子。首先,我为一个名为parent的变量分配了一个匿名函数。显然返回子函数可以访问其外部函数范围,以便它可以访问文本variable.It清晰,easy.Here是代码..对象文字方法的范围

var parent = function() { 
    var text = 'i can access the container'; 
    return function() { 
     alert(text); 
    } 
}(); 
parent(); 

后来我想返回一个对象,而不是其中有一个方法的功能。这个方法不是直接在直接调用函数的主体中,而是在返回的对象内部定义的,但它可以访问名为private的变量,该变量包含一个字符串值。如何将此变量放在范围内f这个对象的文字方法?

var parent = (function() { 
    var text = 'private variable'; 
    return { 
     prop: 'i am the property', 
     method: function() { 
      alert('i can access ' + text); 
     } 
    } 
})(); 
parent.method(); 

回答

3

在JavaScript中,对象文本不创造新的范围,但只有功能做。因此,在IIFE中声明的所有变量都可用于对象字面上的method函数。

1

对象字面可以看出,在中定义的函数它的块范围定义的东西。

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必须给予同样的结果。