《轉》 apply 和 call 的區別

2022-08-26 09:24:08 字數 2134 閱讀 6845

var obj =

function

func(firstname, lastname)

a linxin b

可以看到,obj 是作為函式上下文的物件,函式 func 中 this 指向了 obj 這個物件。引數 a 和 b 是放在陣列中傳入 func 函式,分別對應 func 引數的列表元素。

call 方法第乙個引數也是作為函式上下文的物件,但是後面傳入的是乙個引數列表,而不是單個陣列。

var obj =

function

func(firstname, lastname)

func.call(obj, 'c', 'd'); //

c linxin d

var obj =

function

func()

func.call(obj);

//linxin

我們知道,call 方法的第乙個引數是作為函式上下文的物件,這裡把 obj 作為引數傳給了 func,此時函式裡的 this 便指向了 obj 物件。此處 func 函式裡其實相當於

function

func()

先看例子

var person1  = function

() var person2 = function

() person1.call(

this);}

var person = new

person2();

person.getname();

//linxin

從上面我們看到,person2 例項化出來的物件 person 通過 getname 方法拿到了 person1 中的 name。因為在 person2 中,person1.call(this) 的作用就是使用 person1 物件代替 this 物件,那麼 person2 就有了 person1 中的所有屬性和方法了,相當於 person2 繼承了 person1 的屬性和方法。

function

func()

func.call();

//linxin

在 ecmascript5 中擴充套件了叫 bind 的方法,在低版本的 ie 中不相容。它和 call 很相似,接受的引數有兩部分,第乙個引數是是作為函式上下文的物件,第二部分引數是個列表,可以接受多個引數。

它們之間的區別有以下兩點。

var obj =

function

func()

var func1 =func.bind(obj);

func1();

var obj =

function

func()

var func1 =func.bind(obj);

func1();

// linxin

bind 方法不會立即執行,而是返回乙個改變了上下文 this 後的函式。而原函式 func 中的 this 並沒有被改變,依舊指向全域性物件 window。

function

func(a, b, c)

var func1 = func.bind(null,'linxin');

func('a', 'b', 'c'); //

a b c

func1('a', 'b', 'c'); //

linxin a b

func1('b', 'c'); //

linxin b c

func.call(null, 'linxin'); //

linxin undefined undefined

call 是把第二個及以後的引數作為 func 方法的實參傳進去,而 func1 方法的實參實則是在 bind 中引數的基礎上再往後排。

在低版本瀏覽器沒有 bind 方法,我們也可以自己實現乙個。

if (!function.prototype.bind) 

}}

call 和apply 的區別

call方法 語法 call thisobj,object 定義 呼叫乙個物件的乙個方法,以另乙個物件替換當前物件 說明 call方法可以用來代替另乙個物件呼叫乙個方法。call方法可將乙個函式的物件上下文從初始的上下文改變為由thisobjext指定的新物件。如果沒有提供thisobj引數,那麼g...

call和apply的區別

1 方法定義 call方法 語法 call thisobj arg1 arg2 argn 定義 呼叫乙個物件的乙個方法,以另乙個物件替換當前物件。說明 call 方法可以用來代替另乙個物件呼叫乙個方法。call 方法可將乙個函式的物件上下文從初始的上下文改變為由 thisobj 指定的新物件。如果沒...

call和apply的區別

如下 複製 function add a,b function reduce a,b add.call reduce,1,3 將add方法運用到reduce,結果為4 如下例 如下 複製 function b b window b.call window b.call a 2,3 a 再看乙個複雜的...