2016-03-15 290 views
-1

當foo()被調用時,foo函數中的「this」引用Global範圍,並且「bar」變量已經被定義並賦值爲「bar」。全局範圍變量及其賦值

爲什麼在foo()中,「this.bar」給出了未定義的值,但bar沒有。

function foo(){ 
 
\t this.baz = "baz"; 
 
\t console.log(this.bar + " " + baz); //undefine baz 
 
    console.log(bar + " " + baz); //bar baz 
 
\t } 
 
var bar="bar"; 
 
foo();

+2

它給了我正確的結果,巴茲酒吧,酒吧巴茲 –

+0

@RajaprabhuAravindasamy奇怪的是它不是在工作的jsfiddle但在jsbin https://jsfiddle.net/pqdnv8ob/ – Ramanlfc

+1

工作正常,爲什麼我原來不使用全局範圍變量 –

回答

1

爲什麼裏面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())。

+0

代碼在用窗口替換「this」之前不起作用? – Rita

+0

@Rita - 查看我添加到開頭的答案部分。因爲你的'var bar =「bar」;'實際上不在全局範圍內。這是在一個jsFiddle的任何機會? – jfriend00

+0

對不起,我回來了。 – Rita

0

在JavaScript中,當在全局範圍中定義一個函數時,就像您在示例中那樣,this的值是全局對象。在你的情況下,因爲bar是全局定義的,它可以通過foo()函數中的this.bar訪問。

+0

函數是否在全局範圍內定義並不重要。任何普通函數調用都會在不處於'strict'模式時將'this'設置爲全局對象,或者在'strict'模式下將'this'設置爲'undefined'。 – jfriend00

+0

@ jfriend00那麼爲什麼不'var obj = {me:function(){console.log(this); }};'log'window'? – bwegs

+0

因爲這是一個方法調用,'obj.method()'將'this'設置爲'obj'。有關更多信息,請參閱以下其他答案:[用Javascript設置'this'的5種方式](http://stackoverflow.com/questions/28016664/when-you-pass-this-as-an-argument/28016676# 28016676)。 'obj.method()'不是一個普通的函數調用。 – jfriend00