2012-03-16 34 views
29

我沿着以下的線功能:能「這」永遠是空的Javascript

doSomething: function() { 
     var parent = null; 

     if (this === null) { 
      parent = 'some default value'; 
     } else { 
      parent = this.SomeValue(); 
     } 
    } 

難道父母曾經被設置爲「一些默認值」或者是空多餘的檢查?

或者,如果我使用的限制較少:

doSomething: function() { 
     var parent = this ? this.SomeValue() : 'some default value'; 
    } 

可能永遠母公司在這種情況下被設置爲「一些默認值」?

回答

36

在非嚴格模式下,this經歷了Object(this)轉換,所以它總是很真實。映射到全局對象的例外是nullundefined。所以this永遠不會null並始終真實,使兩個檢查都是多餘的。

但在嚴格模式下,this可以是任何東西,所以在這種情況下,你必須小心。但是,你又必須自己選擇嚴格的模式,所以如果你不這樣做,那就不用擔心了。

(function() {    return this; }).call(null); // global object 
(function() { "use strict"; return this; }).call(null); // null 

ES5的specification表示:

的thisArg值被傳遞無需修改作爲該值。這是從版本3的變化,其中未定義或null thisArg替換爲全局對象ToObject應用於所有其他值,並且該結果作爲此值傳遞。

+0

應當指出的是,試圖調用「someValue中()」在對象上的功能沒有這樣的屬性可能會引起一個小* *擔心。 – Pointy 2012-03-16 15:21:30

+0

好吧,從技術上說,它並不總是經歷過「對象(this)」,因爲如果它是一個對象,它不會,更重要的是,如果它最初是'null'或'undefined',那麼它也不會,它只是直接設置爲全局對象。 – davin 2012-03-16 15:22:59

+0

@davin:其實對於一個對象來說,它是否並不重要(Object(obj)=== obj'),但至於你的第二點,你完全正確。 – pimvdb 2012-03-16 15:24:35

2

雖然不是你的問題的直接答案..在瀏覽器中'this'默認情況下會引用'window'對象。在nodejs上它將引用全局對象。

我不確定是否有過這樣的情況,它可能是空的,但它至少是不尋常的。

+0

Welp ..我會留下我的答案,因爲它可能是有用的,但pimvdb有更好的答案:) – Evert 2012-03-16 15:16:16

2

this關鍵字不應該爲空,但它可能不是您所期望的。如果您不小心,最終可能會引用window對象。

就你而言,我相信this應該參考doSomething函數。

var myObject = { 
    myMethod: function() { 
     console.log(this); 
    } 
}; 

myObject.myMethod(); // prints out a reference to the myMethod function 

這是jsFiddle

0

編號this的值不會是文字'some default value'

0

this不能爲空。如果它爲空,那麼你不能在方法範圍內。

1

如果您嘗試強制Javascript在任何瀏覽器中使用空作用域,可以看到會發生什麼情況。我在這裏做一個例子:

http://jsfiddle.net/rXsWj/

總之,這個經驗證明,在運行瀏覽器的變化「空」到「窗口」。如果您將null更改爲「a」,則會看到像您期望的那樣的「a」警報。代碼的鏈接作爲參考:

function a() { 
    alert(this) 
} 

a.apply(null)