2016-02-28 78 views
6

我在網站上閱讀以下內容:JS:什麼是'這個'強制?嚴格的用法是什麼?

Use-strict有一個優點。它消除了這個脅迫。如果沒有 嚴格模式,則引用此值爲空或未定義的爲 會自動強制爲全局。這可能會導致許多頭飾和 拉出你的頭髮類型的錯誤。在嚴格模式下,引用null或未定義的此 值會引發錯誤。

這是什麼意思?嚴格使用什麼與this脅迫有關?

+2

你對Javascript的'this'有什麼瞭解? (一個解釋必須從一般意義上的「this」的基礎開始,或者......?) – nnnnnn

+3

您引用的文字似乎解釋了「這種強制」意味着什麼(在這種情況下)。你不明白什麼?描述不是很精確:*「在嚴格模式下,引用null或未定義的這個值會引發錯誤。」*當然不是這樣。訪問'this'本身不會拋出錯誤。 'this.something'會。 –

+0

這[鏈接](http://stackoverflow.com/a/11496488/452708)可能會提出一些見解。 – Abhijeet

回答

2

當你調用一個JavaScript功能,「這」將是指根據上下文不同的東西:

  1. 如果該功能已經被綁定,在「這個」將被設置爲任何 它必然,例如fn.bind(x)()

  2. 如果你調用使用fn.call(x)fn.apply(x),該 這將被設置爲x的函數。

  3. 如果函數是用箭頭符號所定義,然後將this 將任何被定義爲this當函數定義 。

  4. 如果您使用thing.fn()調用該函數,則this是'。'之前的 ,在本例中爲'thing'。

  5. 如果您在構造函數的時候,調用new然後this指 正在建設中的新對象。

  6. 如果你只是調用裸的功能,那是不是沒有綁定任何對象, 上,這不是一個箭頭功能,你調用它 以直接的方式,而無需使用呼叫或申請,那麼 this將引用全局對象,如果你不是嚴格模式, 和未定義,如果你在嚴格模式。這就是引用 所稱的「這種強制」。

這就是爲什麼,如果你打開一個瀏覽器控制檯,然後輸入

Function('console.log(this)')()

控制檯將輸出窗口,它是在瀏覽器中的全局對象。不過,如果你打開控制檯,然後輸入

Function('"use strict";console.log(this)')()

控制檯將記錄undefined

我在這裏使用了Function構造函數,因爲它是一種強制使用非嚴格模式的方法,無論它出現在哪種情況下 - 所以這些例子仍然可以工作,即使你從文件內部運行它們或控制檯以嚴格模式運行。

this脅迫能夠得到全局對象的最便捷的方式,在瀏覽器和節點雙方即

const global = Function('return this')()

作品,即使在嚴格模式。

但是大多數情況下,您希望快速失敗,並且您希望在特定種類的實例上運行的函數實際上在您的全局對象上運行,這可能會讓事情變得糟糕。嘗試寫入或從this中讀取某些內容時,如果未定義它,則拋出異常幾乎總是比讀取和寫入全局對象更好。