![](/img/trans.png)
[英]Why is google chart function not being called when it's inside a function?
[英]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
取決於你如何調用一個函數。
如果您在使用調用一個函數call
或apply
則價值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
函數調用時:
調用函數作為表達式的一部分,從對象的屬性獲取函數。 例如foo.bar();
從foo
的bar
屬性中檢索對該函數的引用,然后調用bar
。 因為我們是這樣做的,所以在調用bar
期間, this
指的是foo
。
通過調用函數.call
或.apply
; this
就是您在第一個參數中傳遞的內容。 (在松散模式,如果傳遞undefined
, null
,或非對象在第一個參數,在通話過程中this
將是全局對象。在嚴格的模式,這將是你傳遞什么。)
調用綁定函數。 這是通過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.