this
調用方式:
「bind
、apply
、call
方法」內容
現在先定義另外一個函式,裡面帶兩個參數,並使用 console
來顯示 this
以及「參數 1 」、「參數 2」
「bind
、apply
、call
」這三個方法觀念相近,只是呼叫方式會有點不同
在此會先介紹這三個方法的呼叫方式,以及他跟 this
的關係
這三個都會影響函式的呼叫方式,只不過在運作方面會有些許的不同
首先執行函式會如下圖 count ()
接下來帶「參數 1 」、「參數 2」
接下來就可執行這段函式,這種方式是屬於 simple call
因此 this
會調用全域的物件,因此 this
是全域的 window
接著後面也帶「參數 1 」、「參數 2」
1 | var num = 10; |
Call
接著改用 call
的方式來執行這段函式
使用 count.call
接著第一個帶入的是 this
的物件
把 item
給帶進去,接著帶入 10 和 20
可參考 MDN 文件
現在是使用 call
方式執行時,第一個參數是 this
,後面的參數就會以函式本身的參數依序帶入,所以第 2 行的 item
會替代掉原本這個函式的 this
1 | var num = 10 |
可看到下圖目前執行的結果
原本全域的 window
就會被替換成 item
這個物件,因此 num
就是 100
後面帶上 10 跟 20 的數字
當我們在使用 call
要注意,他是立刻執行,跟我們一般呼叫函式是非常接近
只不過他可透過這種方式將 this
給替換掉
apply
apply
也是類似的觀念,後方也一樣可帶入 this
在此與 call
就有不同點call
是將參數依序帶入,apply
是將參數以陣列呈現,如下圖結果
這兩者運用上是非常接近的,只不過在調用參數有點不同
1 | var num = 10 |
bind
call
在調用時,會立刻執行,但是 bind
是不會立刻執行這段函式
因此在用 bind
時候可先宣告一個變數,並且使用 bind
的方法
注意這段 bind
(下圖圈選處) 是不會立刻執行
把參數傳入的方式與 call
是一樣的
在此把 item
與其他內容傳入
我們在去調用他的時候,他才會執行,使用 temp()
接著他就會立刻去執行這段函式
1 | var num = 10 |
下圖這段程式在調用時,他就會自動把 this
給替換掉,並且把「10」「20」也一起傳進去
在執行 temp()
時候,這個參數就不用另外帶入,如果在這個階段想要另外帶入參數是否可行,如下圖,把參數另外帶進去是不會有任何變化的
在使用 bind
時候就會強制把參數寫進去
在寫入參數時候也可以使用部分寫入的方式,也就是 bind
的地方
第一個參數是寫「10」,但第二個參數先不要帶入
結果如下,第一個參數是「10」,第二個是 temp()
執行的第一個參數
也就是他一樣會依序執行