如果想要改變 this 指向的對象,可以透過 bind、call、apply 這三個 method 辦到。
1 | const person = { |
接著 create 一個函式來呼叫 person 的 userName:
1 | function callName() { |
呼叫 callName:
1 | callName(); |
因為 callName() 函式中的 this 指向的是 global object(也就是 Window 物件),所以這時候我們希望把 callName() 的 this 指向 person 這個對象,可以使用以下方法:
function.bind(thisArg[, arg1[, arg2[, ...]]])
bind 和其他兩個方法(call、apply)的不同有兩點:
我們先單純就第一點來說明,示範最基本的 bind 怎麼寫。
第一種寫法:
1 | callName.bind(person)(); |
第二種寫法,直接寫在函式表示式後面也可以:
1 | const callName = function() { |
接下來針對第二點來說明。先來改寫一下 callName 函式,加入兩個 arguments。
1 | function callName(age, interest) { |
接著我們除了要用 bind 將 this 指向 person 之外,還要給予 age 和 interest 這兩個參數。
這邊有兩種做法:單純給定參數,或綁定永久參數值。
要單純給定參數的話,像一般執行函式那樣,在執行函式時再給予參數就可以了。
1 | const callFunction = callName.bind(person); |
如果將參數放在 bind 中,這個函式拷貝物件的參數值就會永遠被固定住。
1 | const callFunction = callName.bind(person, 24, 'Reading books'); |
function.call(this, arg1, arg2..., argn)
call 和 bind 不同,它會直接執行函式,後面給的參數也不會被固定住。
1 | callName.call(person, 24, 'Reading books'); |
function.apply(this, [arg1, arg2..., argn])
apply 的寫法跟 call 很相近,與 call 不同的是,後面的參數需要使用陣列傳遞,適合搭配 arguments 運用在算數的函式。
1 | callName.apply(person, [24, 'Reading books']); |
function borrowing 就是借別人函式中的方法來用的意思,下面示範 somebody 借用 person 的 getUserName 方法。
1 | const person = { |
function currying 的定義為建立一個函式的拷貝,並設定預設的參數,這在數學運算下很有用。下面我們就利用 bind 的特性來完成 function currying。
1 | const mutiply = function (a, b) { |
上面我們建立了一個函式 mutiply(a, b)
,並用 bind 建立函式物件拷貝 mutiplyByTwo()
。
mutiply.bind(this, 2)
這邊的 this 並不重要,因為函式裡沒有使用到 this。而後面的 2 則是永久綁定了參數 a。
為了讓程式碼比較好理解,這邊將上面那段程式碼拆解,它也等於:
1 | const mutiply = function (a) { |
文章結束囉~如果我的文章對你有幫助,可以幫我拍個手,感謝支持!