JavaScript
讀書會
this
Call()
& Apply()
運用fn(arguments)
( 一般調用,屬於語法糖 )fn.call(this指向, arguments)
( 隱式調用 )fn.apply(this指向, [arguments])
( 隱式調用 )call
和 apply
的區別僅僅是第二個參數的差異call
可以從第 2 個參數傳到 n 個參數 fn.call(undefined, 1, 2, 3, 4...)
。apply
在第 2 個參數傳入陣列,後面再傳入則無效 fn.apply(undefined, [1, 2, 3, 4...])
。call()
可以傳入多個參數 :
apply()
則是傳入一個陣列參數 :
call()
傳入陣列
apply()
傳入多個陣列參數沒用
call
和 apply
是為了改變 this
指向而存在的30,由 obj1
呼叫 fn(10)
,因此 this
指向 obj1
25,因為 this
已經指向 obj2
,所以 obj1
的 fn(n)
裡面所取得的 this.num
會是 obj2
的 num: 15
undefined
window
global
範例 :
誰呼叫函式,就把誰放進 call 第一個參數 :
變異題 :
答案是 undefined
真正呼叫 this
的是 test
這個函式,改成使用 call 呼叫 : test.call()
,在沒有指定 call 第一個參數時,都是預設綁定全域,也就是 window
。
若今天外層的 num
是使用 var
宣告,則答案會是 10
,但 let
和 const
都有自己的區塊作用域,因此在 this
指向全域下讀取不到 num
,所以為 undefined
。
每一個 function 在被執行的時候都會有一個 reference ( 參照 ) 指向 所屬的環境 ,這就是 this。
一般調用
fn()
,function ( fn()
) 的 this
指向全域物件,非嚴格模式下為 window
,嚴格模式下為 undefined
。
物件中調用
obj.fn()
,function ( obj.fn()
) 裡面的 this 指向呼叫他的物件 ( obj
)。
建構式中調用
const john = new Person()
,建構式 ( Person
) 的 this
指向被建構的物件 ( john
)。
隱式調用
fn.call()
fn.apply()
fn.bind()
,使用 call、apply、bind 方式將第一個參數指定 this 指向任何物件。
不知道,this 的值與作用域和程式碼位置完全無關,只跟「你如何呼叫」有關。