2015-07-10 63 views
7

我的印象是「this」關鍵字表示當前所有者在範圍內。顯然,這是錯誤的。讓我得到的代碼:全球功能中的「this」

alert(this);  // alerts as [object Window] -- Okay 

function p1() { 
    alert(this); 
} 

var p2 = function() { 
    alert(this); 
} 

p1();   // alerts as undefined -- ??? 
p2();   // alerts as undefined -- ?? 
window.p1(); // alerts as [object Window] -- Okay 
window.p2(); // alerts as [object Window] -- Okay 

上述第一警報[對象]窗口的代碼,因爲我希望,但那麼接下來的兩次調用P1()和p2()警惕「這個」爲「未定義」 。對p1()和p2()的最後兩次調用將「this」提醒爲[object Window]。

p1()和p2()是否存在於全局(即窗口)範圍中?我認爲調用window.p1()與調用p1()同義,就像調用alert()與window.alert()同義。

以我的(C#)思維方式,p1()和p2()在全局範圍內。這些函數是全局窗口對象的成員,因此當它們引用「this」時,它們應該指向[object Window]。顯然,我在這裏非常錯誤。

+13

看起來像你在嚴格模式下運行腳本 –

+0

在Chrome控制檯上運行良好..我得到'[object window]'所有警報! –

+0

問題是嚴格模式。運行您放置在此處的代碼的行爲與您預期的相同,並提醒所有警報的窗口 – atmd

回答

3

Becasue您使用strict mode按照規範:

如果這是在嚴格的模式碼進行評估,則該值未強制轉換爲一個對象。

你有的代碼不會在警報的所有實例alertwindow,而是因爲你是在嚴格模式下,它是undefined(因爲它應該是)

UPDATE:Chrome瀏覽器開發工具警報windowundefined,但是如果你在一個自執行的函數把它包起來你undefined預期

(function(){ 
    'use strict'; 
    alert(this); 
}()); 
+0

感謝您的澄清。我同意鉻控制檯(開發工具)它不警告「未定義」。讓我困惑! –

+0

它讓我困惑,奇怪的是,火狐使用'使用嚴格'從把它放在控制檯,但丁當需要一個包裝 – atmd

2

當你調用一個函數裏如果foo(),則this的值取決於代碼是否在strict mode中運行(實際上是否爲默認值)。

在嚴格模式下,this將爲undefined(正如您已經發現的那樣)。

在「寬鬆模式」 this確實會參考window,但是這不因爲的功能是全球性的,即「擁有」受到了全球範圍。你會得到同樣的行爲對當地的功能:

(function() { 
 
    function foo() { 
 
    console.log(this); // logs the window object, but `foo` is not global 
 
    } 
 
    foo(); 
 
}());

這是一個簡單的explicitly defined behavior

  1. 如果函數代碼是嚴格代碼,設定ThisBinding到thisArg。
  2. 否則,如果thisArg爲null或未定義,請將ThisBinding設置爲全局對象。
  3. 否則,如果Type(thisArg)不是Object,請將ThisBinding設置爲ToObject(thisArg)。 ...

正如你可以看到,在「寬鬆」的模式下,如果thisArgundefined,是哪種情況,如果你調用函數「正常」爲foo(),那麼它將被設置爲window明確

+0

這只是一個重複:) –

+0

@Kitler:哪個問題?此外,即使它是重複的,它也不會使我的答案無效。 –

+2

迄今爲止的每個範圍問題?你甚至有一個詳細的規範關於他們...... –

0

this是什麼表示你指的是你的對象。它主要用於面向對象編程來區分對象的自身與輸入變量。

例(僞代碼):

var1 //instance variable of object void Constructor(var1){ this.var1 = var1 }

什麼這描述的是構造發生在一個叫做var1變種,並將它自己的變量var1它。

在你的情況,我會假設,在一個函數:

function p1() { alert(this); }

被稱爲p1();,它不是嚴格的對象範圍內,因此this並不意味着什麼。通過從窗口的上下文window.p1();中調用它,您正在使窗口對象調用該函數,因此給出了一個值this

+0

抱歉,但那不正確。這個問題是由嚴格模式造成的。在例子中,p1()和window.p1()是相同的東西,嚴格模式是什麼影響'this'的值 – atmd