function a(x, y)
var c = {};
a.call(c,5,6); //5 6 {} arguments = [5,6]
再看例子
function person(age, male)
var person1 = {};
person.call(person1,20, "female"); //person1 =
var person =
};var person1 = ;
person.sayage.call(person1); //my age is30 my male is male
var person = ;
var age = 30;
function sayage (male)
sayage("male"); //30 male 函式中的this指向window
var foo = sayage.bind(person,"female"); //20 female
sayage.call(person,"female"); //20 female
foo(); //20 female
bind()方法的實現:
bind()方法有兩條準則:
1.會返回乙個函式
2.可以傳參,既可以給bind()函式傳參,又可以給返回函式傳參。
首先滿足第乙個條件
function.prototype.mybind = function(contex)
}
然後滿足引數條件
function.prototype.mybind = function(contex);
};
另外,返回函式還可以當建構函式使用,因此,還需要加入當建構函式使用時的程式:
function.prototype.mybind = function(contex);
fbound.prototype = this.prototype; //修改返回函式的prototype為繫結函式的prototype,例項就可以繼承函式原型中的值,至此就形成了繼承的關係。所以,當作為建構函式使用時,this指向例項,self指向繫結函式,結果返回true;相反,如果沒有new的話,表示返回函式只是普通函式呼叫,這時,this指向window,self指向繫結函式,所以,返回false.
return fbound;
};
用call()方法實現bind();
function.prototype.mybind = function(contex);
fbound.prototype = this.prototype;
return fbound;
};
call()方法的實現:
基本實現過程分為三步:
為物件新增方法。
方法執行。
刪除方法。
程式:
function.prototype.mycall = function(context);
還可以用es6的方法:
function.prototype.mycall = function(context);
person.mycall(bar,"wang",18);
context.fn = this; //這個this指向呼叫的函式,為物件新增乙個函式
//為這個函式傳參
var args = ;
for (var i = 0; i < arguments[1].length; i++)
context.fn( ...args );
delete context.fn;
};
call apply bind方法詳解
var name window var newthis function showname info1,info2 showname a b 輸出 window a b 通過bind改變this指向 var newshowname showname.bind newthis,hello world ...
call apply bind 方法用法測試
call 1 use strict function test xx,yy let a 呼叫test方法,將 a 放到方法裡當作 this。所以裡列印a才會有值的。test.call a,10,20 console.log a 3 use strict function test xx,yy let...
call apply bind方法及其應用
1 call 方法可以呼叫乙個函式 functionfn fn.call window2 call 方法可以改變函式的this指向 var o function fn x,y 利用call方法後this指向了o這個物件 fn.call o,1,2 call方法總結 var o function fn...