2015-05-15 37 views
-1

據我所知,你在JavaScript中聲明的一切,屬於全局對象(除非你聲明的對象的內在的東西,那麼對象將屬於窗口對象,不管你聲明它的內部,對象),因此,在瀏覽器環境中,全局對象是window東西我不理解「使用嚴格的」,這

說你聲明: var x = 'hi'

這可以通過訪問:

x

OR

window.x

而且兩者是完全一樣的,RI GHT?那麼,爲什麼,有'use strict',從「全局」變量返回this的時候,我只能如果我指定說功能屬於window得到window對象?

function fun() { 
    'use strict'; 
    return this; 
} 

fun(); // undefined 
window.fun(); // window object 
// Aren't both absolutely the same? 

而且,爲什麼這個函數返回後undefined,如果函數應該屬於obj

obj = { 
    method: function() { 
     'use strict'; 
     function yeah() { // Doesn't this belong to obj? 
      return this; // It certainly doesn't seem that 'yeah' 
     }     // belongs to window. 
     return yeah(); 
    } 
}; 

謝謝。

回答

0

那麼,爲什麼'use strict'從'global'變量返回時,如果我指定該函數屬於窗口,我只能得到窗口對象嗎?

您可以通過簡單訪問它window來獲得window對象。

它不會是this的值,因爲該功能很容易意外地寫入不安全的代碼,並帶來性能成本。

From MDN

不僅是自動的拳擊性能成本,但暴露在瀏覽器中 全局對象是一個安全隱患,因爲全球 對象提供接入功能,「安全」的JavaScript 環境必須限制。因此,對於一個嚴格的模式功能,指定 這不是盒裝成一個對象,如果未指定,這 將不確定


而且,爲什麼這個函數返回不確定的,如果函數應該屬於obj?

雖然yeah是一個函數,它是obj的方法,yeah本身的範圍不是obj一個方法,你不叫它爲一體。

即因爲你打電話yeah()而不是obj.yeah()(或yeah.call(obg)等)。

雖然這與"use strict"無關。

+0

所以'this'嚴格用於對象方法,對嗎?其他任何東西只屬於一個範圍?另外,爲什麼在不帶'window.setTimeout'語法的情況下,在'use strict'方法內調用'setTimeout'會返回'window'對象?它不應該也返回undefined? – ChuckBerry

+0

沒關係,它似乎是這樣的,因爲'setTimeout'在嚴格模式下本身不運行。 – ChuckBerry

0

this函數內部應該返回該函數被調用的對象(使用obj.method()語法)。

沒有use strict如果函數(通過只是做func()代替obj.func()例如)呼籲任何其他方式的this值將被設置爲window。這很混亂。 use strict可以確保當函數不稱爲一個對象的方法this正確不確定的。

相關問題