爲什麼裏面FOO(), 「this.bar」 給出明確的值,但酒吧確實 沒有。
可能您的var bar="bar";
實際上並不在全球範圍內。如果它是你的代碼將如圖所示工作。引用bar
將在任何父範圍中找到變量。但是,當this
設置爲全局對象時,this.bar
需要在全局範圍中定義的bar
。因此,我們得出結論var bar="bar";
實際上並不在全球範圍內。
當你做一個正常的函數調用,你是不是在strict
模式下運行,this
將被設置爲全局對象,它是在瀏覽器中window
。一般來說,這不是推薦使用的this
,實際上,它會在strict
模式中突破。但是,我會解釋你的代碼中發生了什麼。使用this
當
function foo(){
window.baz = "baz";
log(window.bar + " " + baz);
log(bar + " " + baz); //bar baz
}
window.bar="bar";
foo();
// display output
function log(x) {
var div = document.createElement("div");
div.innerHTML = x;
document.body.appendChild(div);
}
而且,這裏的版本:
在你的具體的例子,你可以用window
取代this
和你的代碼基本上是這樣
function foo(){
this.baz = "baz";
log(this.bar + " " + baz);
log(bar + " " + baz); //bar baz
}
bar="bar";
foo();
// display output
function log(x) {
var div = document.createElement("div");
div.innerHTML = x;
document.body.appendChild(div);
}
而且,如您所見,運行任一代碼段時都沒有undefined
值。
如果您在strict
模式的代碼(強烈推薦),然後this
將在一個正常的函數調用設置爲undefined
,你的代碼將失敗。相反,只有當您知道它已被專門設置爲您想要的值時才使用this
,例如在調用new
的構造函數中,或在方法調用中或在回調中將this
設置爲已知值(可能與.call()
或.apply()
)。
它給了我正確的結果,巴茲酒吧,酒吧巴茲 –
@RajaprabhuAravindasamy奇怪的是它不是在工作的jsfiddle但在jsbin https://jsfiddle.net/pqdnv8ob/ – Ramanlfc
工作正常,爲什麼我原來不使用全局範圍變量 –