2012-04-04 94 views
7

這是我確信我應該知道的答案,但無論我只是愚蠢的,或者我只是以前從來沒有遇到過這個...數組中的函數的上下文是什麼?

鑑於以下數組,聲明在全球範圍內:

var arr = [function() { 
    console.dir(this); 
}]; 

我本來期望this指的Window對象。然而,在調用函數時:

arr[0]();​ //Logs Array 

看來,this實際上指的是陣列。然後,當我存儲函數的引用在另一個變量和調用,this確實指的是Window對象:

var func = arr[0]; 
func(); //Logs Window 

那麼,爲什麼功能變化的背景下?這是一個fiddle demonstrating the above two cases

+0

'this'指的是車主,所以我猜車主在執行時會擡頭。 http://www.quirksmode.org/js/this.html – Silvermind 2012-04-04 10:03:22

回答

5

當你調用一個函數作爲一個對象的屬性,如obj.func()thisobj
這正是你在這裏做的。 arr是你的對象,並0是持有物業的功能。畢竟,數組只是對象,它們的元素是它們屬性的值(儘管屬性通常是數字字符串(所有屬性都是字符串))。

更多信息請參見MDN - this,在這種情況下:

當一個函數被調用作爲對象的方法,其this被設定爲方法被調用的對象。

在你的第二個情況下,調用該函數「獨立」,因此thiswindow。如果代碼在嚴格模式下運行,則this將爲undefined

+0

更確切地說,'window' **是一個對象,每個全局**都是**'window'的參數。 – freakish 2012-04-04 10:09:19

+0

「畢竟,數組只是對象」......這使得它非常有意義。我只是很愚蠢。謝謝。 – 2012-04-04 10:09:45

+0

@freakish:這與這個問題有什麼關係?即使變量不是全局的,this也是指'window'。在OP的代碼中,'func'也可以是其他函數中的局部變量。我假設你的意思是全局變量是'window'的*屬性*。 – 2012-04-04 10:10:26

0

這是因爲this關鍵字實際上是它返回參照它被調用的函數的所述保持器(或擁有者)的操作者。由於在第一種情況下持有者是一個數組(它是一個對象),它返回一個數組。在第二種情況下,持有人是窗口對象。

查看this article瞭解更多詳情。

0

注意:

在JavaScript中,this總是指函數的所有者。

你可以閱讀更多關於它at quirksmode

0

因爲元件是陣列中的一員,並this總是指向所有者對象(除非使用bind()/call()/apply()等播放)。如果你不是一個對象的一部分,this將是全局對象;在瀏覽器環境中爲window。這是例外,如果你在嚴格模式,其中thiswill be undefined

你正在做什麼是有效的一樣:

var ar = { 
    '0' : function() { 
     console.dir(this); 
    } 
} 

ar[0](); 
var func = ar[0]; 
func(); 

...這可能更有意義概念。

http://jsfiddle.net/TVtwr/1/

+0

它不完全相同。一個數組是一個不同的「類型」,具有與普通對象不同的行爲。 – 2012-04-04 10:06:11

+0

@MichaelAnderson:我的意思是根據「this'的分辨率。 – Matt 2012-04-04 10:07:07

相關問題