Function.prototype.call

weixin_34129145發表於2018-08-03

本文主要是個人對call()方法的一點理解


函式原型

myFunc.call(thisArg, arg1, arg2, ...)

引數理解

call方法與傳統的傳參呼叫不同的是,call不只指定函式的引數(arg1,arg2...),還指定了函式在執行時的this指向(thisArg)

這是一個能幫助理解this指向的例子 :

"use strict";
function Product(name, price) {
  this.name = name;
  this.price = price;**函式說明**
>**可以讓call()中的物件(thisArg)呼叫當前物件所擁有的function(myFunc)**
}

function Food(name, price) {
  Product.call(this, name, price);
  console.log(this.name)
}

Food('cheese', 5)

輸出:

9341918-714f8cf6de1c7c7c.png

在函式Food中,我們並沒有為其this賦值,卻能夠輸出this的值,這是因為,我們使用了call(),將Food中的this傳給了Product函式,並且為其進行了賦值

我們可以將上面程式碼理解成下面這樣,雖然不能執行,但能幫助我們理解上面程式碼的傳參過程:

"use strict";
function Product(foodThis,name, price) {
  foodThis.name = name;
  foodThis.price = price;
}

function Food(name, price) {
  Product(this, name, price);
  console.log(this.name)
}

Food('cheese', 5)

作用理解

可以讓call()中的物件(thisArg)呼叫當前物件所擁有的function(myFunc)

假如物件A有方法func(arg1,arg2),而物件B沒有,此時我們便可以藉助call函式來完成B物件呼叫A物件方法的過程,而不用為B物件再寫一個func()

A.func.call(B,arg1,arg2)

此時call函式的作用可以這樣描述 :

  • 通過call函式,讓call中的物件B呼叫了當前物件A所擁有的方法func()

關於call的另一些例子可以在個人的這篇文章找到
類陣列元素如何作為陣列使用 ---(call方法)