2012-09-20 46 views
1

我對javascript對象來說相當陌生,我可以在調用變量時使用一些說明。我試圖在bar函數中調用測試變量。這可能嗎?如果是這樣,我會如何正確地做?調用JavaScript對象的問題

var foo = { 

    bar: function() 
    { 
     var test = 'Hello World'; 
    }, 

    speak: function() 
    { 
     // Log the Variable from above ^^ 
     console.log(foo.bar.test); 
    } 

}; 

感謝

回答

2

否;局部變量在其聲明函數外部是不可見的。

相反,你需要的屬性添加到對象:

foo.test = ...; 

您還可以設置foo.bar.test;那會爲函數對象添加一個屬性。

0

您可以通過調用bar方法返回測試。

var foo = { 

    bar: function() 
    { 
     var test = 'Hello World'; 
     return test; 
    }, 

    speak: function() 
    { 
     // Log the Variable from above ^^ 
     console.log(foo.bar()); 
    } 

}; 
+0

謝謝,這兩個答案都很有幫助。 –

0

爲了訪問變量測試以這種方式,就需要將其定義爲像這樣的對象的屬性:

var foo = { 
    test: 'Hello World, before calling bar()', 
    bar: function() 
    { 
     this.test = 'Hello World'; 
    }, 
    speak: function() 
    { 
     // Log the Variable from above ^^ 
     console.log(this.test); 
    } 
}; 
console.log(foo.test); 

我也改變功能用於訪問對象foo關鍵字this。它通常會正常工作,但在JavaScript中跟蹤您的範圍可能會有些棘手,所以試着意識到這一點。

1

當您在函數內部聲明一個局部變量時,將它添加到函數的VariableEnvironment(其實際上與外部LexicalEnvironment沒有什麼不同,但ECMA區別它們)。該功能參考宣佈範圍的LexicalEnvironment(在我們的示例中,全局對象窗口)。當您試圖從內部引用變量時,引擎首先搜索該函數的本機VariableEnvironment,然後,如果未找到,則在外部LexicalEnvironment中搜索。在你的情況下,你試圖從函數的外部引用變量,所以引擎在最初的全局對象範圍內搜索它。

因此,爲了完成任務,您應該聲明外斯克羅普的變量,然後分配給它的功能裏面,或者你應該在新的屬性添加到該對象,然後引用它:

var foo = { 
    test: 'Hello world', 
    speak: function() 
    { 
     console.log(this.test); 
    } 

};