簡體   English   中英

為什么在調用apply()或call()時,“ this”指向函數內部的窗口?

[英]Why 'this' points to window inside a function when apply() or call() is being called?

我正在閱讀Nicholas Z.Zakas針對Web開發人員第三版的專業JavaScript,在“引用類型”一章中,我對函數類型部分有些困惑。

function sum(num1, num2){
return num1 + num2;
}

function callSum1(num1, num2){
return sum.apply(this, arguments);
}

alert(callSum1(10,10)); //20

他說:

“在此示例中, callSum1()執行sum()方法,將this作為this值傳入(由於在全局范圍內被調用,因此等於window ),並且還傳入arguments對象。”

我明白他說什么,但不明白為什么。 This應該指向功能不是嗎? 現在我很困惑它指向窗口,因為它是在全局范圍內被調用的。

有人可以向我解釋嗎? :)

我不確定是否會或以后必須使用此技術,但是我想確保自己了解它,尤其是這一部分。 有關this及其用法的更多詳細信息將在“ OOP”部分中,但現在這是一個有趣的問題。

提前致謝!

this取決於你如何調用一個函數。

如果您在使用調用一個函數callapply則價值this將是第一個參數傳遞給函數。

在這里,您有sum.apply(this, arguments); 因此它將通過當前值。 通常,該值由調用函數的方式確定。

由於您在沒有上下文的情況下調用callSum1(10,10)this它將是window

(如果處於嚴格模式下,它將是undefined 。如果您不在瀏覽器中,那么它將與您所使用的JS環境的默認對象無關)。

這里:

alert(callSum1(10,10)); //20

......你打電話callSum沒有做任何事情來設置this在通話過程中,因此this被默認為全局對象( window ,在瀏覽器上)。 (在寬松模式下;在嚴格模式下, this將是undefined 。)

從那時起,你使用apply ,並通過同this到它:

return sum.apply(this, arguments);

...自然地,在調用sum時也會使用全局對象。

我明白他說什么,但不明白為什么。 這應該指向功能不是嗎?

不, this幾乎從不涉及功能。 (當然,它很少會這樣做。)

現在我很困惑它指向窗口,因為它是在全局范圍內被調用的。

這不是因為它在全局范圍內被調用。 如果從函數內部調用它,將是相同的。 重要的不是呼叫發生在哪里 ,而是如何發生。 你調用一個函數沒有做任何事情任何時候設置this ,在寬松的模式, this在函數調用期間將是全局對象。 它不必處於全球范圍內; 重要的是如何調用該函數。

該規則實際上是一個簡單了很多比人做出來是:如果你調用一個函數沒有做任何事情來設置this ,在通話過程中, this將是全球對象(松散模式)或undefined (嚴格模式)。 以下是你可以做把東西this函數調用時:

  1. 調用函數作為表達式的一部分,從對象的屬性獲取函數。 例如foo.bar(); foobar屬性中檢索對該函數的引用,然后調用bar 因為我們是這樣做的,所以在調用bar期間, this指的是foo

  2. 通過調用函數.call.apply ; this就是您在第一個參數中傳遞的內容。 (在松散模式,如果傳遞undefinednull ,或非對象在第一個參數,在通話過程中this將是全局對象。在嚴格的模式,這將是你傳遞什么。)

  3. 調用綁定函數。 這是通過Function#bind (ES5功能)創建的Function#bind 綁定函數將this “嵌入”到它們中。

更多(在我的博客上)

下的窗口對象部分20〜頁之后,我讀這樣的:“如前面所提到的, this值相當於當一個函數與沒有明確的執行全局對象this或者通過作為一個對象的方法,或通過指定的值( call() / apply() ”。 :)

也許我以前沒聽懂,但現在他的話也很清楚。 順便說一下,這本書太棒了! 現在,通過Math對象,我也可以了解更多apply()方法。

var values = [1,2,3,4,5,6];
var max = Math.max.apply(Math, values);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM