我所理解的call和apply

2021-10-07 02:23:16 字數 2795 閱讀 3651

一、先來看看示例

這兩個方法的用途都在特定的作用域中呼叫函式,實際上等於設定函式體內this物件的值。

例一:

123

4567

891011

1213

1415

function

box(num1,num2)

function

sum(num1,num2)

alert(sum(10,10));

function

sum(num1,num2)

alert(sum(15,10));

例二:

123

4567

891011

1213

1415

//prototype下面的方法call()

var color ="紅色的";

var box =

function

saycolor()

saycolor();

//用call是實現物件冒充,冒充box,冒充window下

saycolor.call(window);//紅色,冒充window

saycolor.call(this);//紅色,this就是window

saycolor.call(box);//冒充box,作用域就在box物件裡面,所以color就是藍色的

這個例子是之前作用域理解的例子修改而成,我們可以發現當我們使用call(box)方法的

時候,saycolor()方法的執行環境已經變成了box物件裡了。

123

4567

8

function

box(num1, num2)

function

callbox(num1, num2)

alert(callbox(10,10));

二、關於call

call方法呼叫乙個物件的乙個方法,以另乙個物件替換當前物件。

call([thisobj[,arg1[, arg2[, [,.argn]]]]])引數

call 方法可以用來代替另乙個物件呼叫乙個方法。call方法可將乙個函式的物件上下文從初始的上下文改變為由 thisobj 指定的新物件。

如果沒有提供 thisobj 引數,那麼 global 物件被用作 thisobj。

示例三:

123

4567

89

function

add(a,b)

function

sub(a,b)

add.call(sub,3,1);

這個例子中的意思就是用 add 來替換 sub,add.call(sub,3,1) == add(3,1) ,所以執行結果為:alert(4);

示例四:

123

4567

891011

1213

1415

16

function

class1()

}function

class2()

var c1 = new class1();

var c2 = new class2();

c1.shownam.call(c2);

注意,call 的意思是把 c1 的方法放到c2上執行,原來c2是沒有shownam() 方法,現在是把c1 的shownam()方法放到 c2 上來執行,所以this.name 應該是 class2,執行的結果就是:alert(」class2」);

示例五:實現繼承

123

4567

891011

1213

function

class1()

}function

class2()

var c2 = new class2();

c2.showtxt("cc");

這樣 class2 就繼承class1了,class1.call(this)的意思就是使用class1物件代替this物件,那麼 class2中不就有class1的所有屬性和方法了嗎,c2物件就能夠直接呼叫class1的方法以及屬性了,執行結果就是:alert(「cc」);

示例六:實現多重繼承

123

4567

891011

1213

1415

1617

1819

2021

function

class10()

}function

class11()

}function

class2()

很簡單,使用兩個call就實現多重繼承了。當然,js的繼承還有其他方法,例如使用原型鏈,這個不屬於本文的範疇,只是在此說明call的用法。

1

func.call(func1,var1,var2,var3)

1

示例七:

123

45

alert(math.max(5,8)) //8

alert(math.max(5,7,9,3,1,6)) //9

var arr=[5,7,9,1]

新手理解 apply 和 call

假設我們有乙隻喵星人 const cat can run 還可以跳 包括跳牆是可以的 jump can jump 複製 同時,它還有乙個小夥伴汪星人 const dog can run 還會吠 bark bark loudly 馬戲團的?還會做算數 count a,b 複製 不難發現,貓狗各有所長....

深入理解 call 和 apply

js中乙個主要的內容就是this的指向問題.共同之處 他們都能改變this的指向,都是在特定的作用域中呼叫函式,等於設定函式體內this物件的值,以擴充函式賴以執行的作用域。一般來說,this總是指向呼叫某個方法的物件,但是使用call 和說到他們的功能,我就拿call來舉例子吧,因為他們的功能是一...

js的call 和apply 方法的理解

call 方法 通過call 我們可以使用屬於另乙個物件的方法 var person var person1 var person2 conslole.log person.fullname.call person1 bill gates 使物件person1使用物件person的fullname方...