Call 與Apply 的異同

2021-08-16 21:01:25 字數 1720 閱讀 4542

在了解異同之前,先來搞清楚這兩個方法都是怎麼用的

call()

function.call(obj[,arg1[, arg2[, [,.argn]]]]])
呼叫call的物件必須是個函式function

call的第乙個引數將會是function改變上下文後指向的物件,也就是上面例子裡的小剛,也就是上上面例子裡的老婆大人,如果不傳,將會預設是全域性物件window

第二個引數開始可以接收任意個引數,這些引數將會作為function的引數傳入function

呼叫call的方法會立即執行

與call方法的使用基本一致,但是只接收兩個引數,其中第二個引數必須是乙個陣列或者類陣列,這也是這兩個方法很重要的乙個區別

陣列與類陣列小科普

陣列我們都知道是什麼,它的特徵都有哪些呢?

可以通過角標呼叫,如 array[0]

具有長度屬性length

可以通過 for 迴圈和foreach方法進行遍歷

類陣列顧名思義,具備的特徵應該與陣列基本相同,那麼可以知道,乙個形如下面這個物件的物件就是乙個類陣列

var arraylike =
類陣列arraylike可以通過角標進行呼叫,具有length屬性,同時也可以通過 for 迴圈進行遍歷

我們經常使用的獲取dom節點的方法返回的就是乙個類陣列,在乙個方法中使用 arguments關鍵字獲取到的該方法的所有引數也是乙個類陣列

但是類陣列卻不能通過foreach進行遍歷,因為foreach是陣列原型鏈上的方法,類陣列畢竟不是陣列,所以無法使用

那麼如何才能讓類陣列能夠使用foreach呢?小夥伴們可以在看完本篇後自己思考一下哦

相同點

都能夠改變方法的執行上下文(執行環境),將乙個物件的方法交給另乙個物件來執行,並且是立即執行

不同點

call方法從第二個引數開始可以接收任意個引數,每個引數會對映到相應位置的func的引數上,可以通過引數名呼叫,但是如果將所有的引數作為陣列傳入,它們會作為乙個整體對映到func對應的第乙個引數上,之後引數都為空

function func (a,b,c) {}

func.call(obj, 1,2,3)

// function接收到的引數實際上是 1,2,3

func.call(obj, [1,2,3])

// function接收到的引數實際上是 [1,2,3],undefined,undefined

// function接收到的引數實際上是 1,2,3

0: 1,

1: 2,

2: 3,

length: 3

})// function接收到的引數實際上是 1,2,3

由於可以改變this的指向,所以也就可以實現物件的繼承

function superclass () 

}function subclass ()

subclass();

// 1

subclass通過call方法,繼承了superclass的print方法和a變數,同時subclass還可以擴充套件自己的其他方法

Apply與Call的異同

call 方法 function.call thisobj arg1 arg2 argn 它們各自的定義 call 呼叫乙個物件的乙個方法,用另乙個物件替換當前物件。例如 b.call a,args1,args2 即a物件呼叫b物件的方法。它們的共同之處 都 可以用來代替另乙個物件呼叫乙個方法,將乙...

call與apply方法的異同

改變物件的執行上下文 什麼是執行上下文?我們在寫乙個方法的時候,總是會用到乙個關鍵字this,而this的指向就是我們這裡所說的執行上下文 執行環境 首先我們要知道,this指向的永遠是呼叫該方法的物件,如何證明this的指向就是當前物件呢?看下面這段 function func func 1 中方...

call和apply的異同

共同點 作用 呼叫乙個物件的乙個方法,以另乙個物件替換當前物件。將乙個函式的物件上下文從初始的上下文改變為由 thisobj 指定的新物件。如果沒有提供 thisobj 引數,那麼 global 物件被用作 thisobj。以call為例,語法 obj1.method1.call obj2,argu...