2012-11-13 131 views
1

聲明:這在全球範圍內

for(var item in this){ 
    console.log(item); 
} 

是全球範圍內一個空操作。然而在一個函數中

function foo(){ 
    for(var item in this){ 
     console.log(item); 
    } 
} 
foo(); 

這產生全局環境對象。 這種行爲的原因是什麼?

與第一個示例中一樣,訪問當前處於範圍內的對象的語法是什麼?

+0

是的,只是在小提琴中測試它http://jsfiddle.net/joplomacedo/Luvbp/ - 按預期工作。 – banzomaikaka

+0

我在node.js中運行這個。這不是語言定義的質量嗎? –

+1

節點可能是原因... – 0x499602D2

回答

1

this可能指向節點的導出對象。

所以在第一種情況下,this是正確的,不要指向window對象。在第二種情況下,this在函數內(這不是對象的方法),因此,如您所期望的那樣,它指向window

+0

exports是Node中定義的對象嗎? –

+0

是http://nodejs.org/api/modules.html#modules_module_exports – banzomaikaka

+1

@ JOPLOmacedo - 那麼如何以嚴格模式安全的方式訪問node.js中的全局對象?有理由這樣做嗎? – RobG

1

看看MDN's introduction to the this keyword

在全局範圍內,this引用全局對象。

在嚴格模式下(您似乎沒有啓用),一個簡單的函數調用會導致這個值爲undefined

對於非嚴格函數(如foo),一個簡單的調用將導致this再次成爲全局對象。

1

ECMA-262 §10.4.1.1顯示當進入全局執行上下文時,this被設置爲全局對象。因此,如果第一個代碼示例在全局上下文中執行,則this應引用全局對象。

我沒有node.js,但如果這是主機環境,則應該在問題中添加一個node.js標記以吸引知道node.js的人。

在第二個示例中,函數的this未由調用設置,因此它默認爲全局對象。在嚴格模式下,它將不確定,嘗試訪問this會引發錯誤。

+0

看來,node.js全局對象混淆了我的想法。 –

2

在JavaScript中,「this」不是當前對象,而是當前方法的運行上下文。

例如:

function foo(){ 
    console.log(this); 
} 

在全球範圍內:

  • 如果我叫富(),控制檯日誌全球
  • 如果我叫的setTimeout(FOO, 0),控制檯記錄Timer對象,因爲foo是由定時器調用的。

調用方法的最佳方法是使用Function對象的調用方法在調用方法時綁定自己的運行上下文。

foo.call(this); 

對不起我的英語不好。^-^