2014-10-19 27 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必須給予同樣的結果。