apply call bind和this的使用

2022-03-28 18:37:29 字數 2450 閱讀 2896

立即呼叫fun,同時將fun函式原來的this指向傳入的新context物件,實現同乙個方法在不同物件上重複使用

context:傳入的物件,替代fun函式原來的this;

argsarray:乙個陣列或者類陣列物件,其中的陣列引數會被展開作為單獨的實參傳給 fun 函式,需要注意引數的順序。

fun.call(context,[arg1],[arg2],[…])

使用:

math.max()    //

只接收單獨的引數,通過下面的方法可以在陣列上面使用max方法:

會將array陣列引數展開成單獨的引數再傳入

array.prototype.slice.call(arguments); //

在類素組物件上使用slice方法

function

isarray(obj)

//驗證是否是陣列

fun.bind(context,[arg1],[arg2],[…])

arg1:要傳遞到新函式的引數列表

返回乙個函式供後續呼叫,其函式體和原函式fun一樣

,但新函式的this永遠

指向新傳入的context物件。新函式會具有bind方法指定的初始引數arg1/arg2...,後續呼叫新函式時的實參要往已有引數的後面排。

//

原來的函式有4個引數

var displayargs = function

(val1, val2, val3, val4)

var emptyobject ={};

//生成新函式時bind方法指定了2個引數,則新函式會帶著這個兩個實參

var displayargs2 = displayargs.bind(emptyobject, 12, "a");

//呼叫時傳入另2個引數,要在bind方法傳入的2個實參後面

displayargs2("b", "c");

//output: 12 a b c

事件處理函式中使用bind:

var obj =.bind(

this)); //

使用bind方法繫結this

}}

使用bind()方法改寫slice()方法:

var _slice =array.prototype.slice;

var slice =function.prototype.call.bind(_slice);

slice(…);

bind()相容ie5~ie8處理

if (!function.prototype.bind) 

bindargs = array.prototype.slice.call(arguments, 1); // 繫結函式時傳入的引數

var fnop = function () {};

var fbound = function ()

// 將新物件設為原函式的例項,即新物件 instanceof 原函式為 true

fnop.prototype = this.prototype;

fbound.prototype = new fnop();

return fbound;

}}

一般情況下settimeout()的this指向window或global物件。當使用類的方法時需要this指向類例項,就可以使用bind()將this繫結到呼叫物件,而不用傳入self方式傳入this。

this

this物件是在函式執行時基於函式的執行環境繫結的:在全域性函式中,this等於window,而當函式被當作某個物件的方法呼叫時,this等於那個物件。

/*

例1*/

function

foo()

var obj2 =;

var obj1 =;

obj1.obj2.foo();

//42;當foo函式被呼叫時,其本身是歸obj2所擁有

/*例2

*/function

foo()

var obj =;

var bar = obj.foo; //

bar引用foo函式本身

var a = "global"; //

全域性物件的屬性

bar(); //

"global" ;

在乙個html dom事件處理程式裡面,this始終指向這個處理程式被所繫結到的dom節點。 

apply call bind學習和總結

1 call方法 語法 fun.call thisarg,arg1,arg2,call 方法在使用乙個指定的this值和若干個指定的引數值的前提下呼叫某個函式或方法。當呼叫乙個函式時,可以賦值乙個不同的 this 物件。this 引用當前物件,即 call 方法的第乙個引數。需要注意的是,指定的th...

apply call bind 使用總結

參考 語法 語法 fun.call thisarg arg1 arg2 var a var b a.fn 接受的是乙個陣列var a var b a.fn 接受的是引數 b.call a,1,2 3var a var b a.fn b.bind a,1,2 以上code我們會發現並沒有輸出.bind...

apply,call,bind個人總結

首先他們是用來改變呼叫方法中this的指向的,而且他們都是function的prototype。分別為 function.prototype.call function.prototype.bind 引數1 thisarg 物件也就是需要指向this的物件 引數2 argsarray 陣列 會按對應...