課程
/前端開發(fā)
/JavaScript
/JavaScript深入淺出
在您的實(shí)例中使用call方法和apply方法有什么區(qū)別?使用時應(yīng)注意什么您可以詳細(xì)講解一下嗎?
2015-05-14
源自:JavaScript深入淺出 9-1
正在回答
好詳細(xì)。。。。。。
apply and call
????它們的作用都是將函數(shù)綁定到另外一個對象上去運(yùn)行,兩者僅在定義參數(shù)方式有所區(qū)別:
???? apply(thisArg,argArray);
???? call(thisArg[,arg1,arg2…] ]);
即所有函數(shù)內(nèi)部的this指針都會被賦值為thisArg,這可實(shí)現(xiàn)將函數(shù)作為另外一個對象的方法運(yùn)行的目的
apply的說明
如果?argArray?不是一個有效的數(shù)組或者不是?arguments?對象,那么將導(dǎo)致一個?TypeError。如果沒有提供?argArray?和?thisArg任何一個參數(shù),那么?Global?對象將被用作?thisArg,?并且無法被傳遞任何參數(shù)。
call的說明
call方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisArg指定的新對象。如果沒有提供?thisArg參數(shù),那么?Global?對象被用作?thisArg
相關(guān)技巧:
應(yīng)用call和apply還有一個技巧在里面,就是用call和apply應(yīng)用另一個函數(shù)(類)以后,當(dāng)前的函數(shù)(類)就具備了另一個函數(shù)(類)的方法或者是屬性,這也可以稱之為“繼承”。
看下面示例:
//?繼承的演示function?base() {????this.member = " dnnsun_Member";????this.method =?function() {???????? window.alert(this.member);???? }}function?extend() {?????base.call(this);???? window.alert(member);???? window.alert(this.method);}
上面的例子可以看出,通過call之后,extend可以繼承到base的方法和屬性。
順便提一下,在javascript框架prototype里就使用apply來創(chuàng)建一個定義類的模式,
其實(shí)現(xiàn)代碼如下:
var?Class = {?? create:?function() {????returnfunction() {??????this.initialize.apply(this, arguments);???? }?? }}
解析:從代碼看,該對象僅包含一個方法:Create,其返回一個函數(shù),即類。但這也同時是類的構(gòu)造函數(shù),其中調(diào)用initialize,而這個方法是在類創(chuàng)建時定義的初始化函數(shù)。通過如此途徑,就可以實(shí)現(xiàn)prototype中的類創(chuàng)建模式
示例:
var?vehicle=Class.create();vehicle.prototype.initialize= function(type)
{????????this.type=type;}
vehicle.prototype.showSelf= function()
{????? alert("this vehicle is "+?this.type);}
var?moto=new?vehicle("Moto");moto.showSelf();
?原文http://www.cnblogs.com/Ghost-Draw-Sign/articles/1530108.html
舉報
由淺入深學(xué)習(xí)JS語言特性,且解析JS常見誤區(qū),從入門到掌握
1 回答bind,call,apply,的作用有區(qū)別嗎?
1 回答call和apply
1 回答apply、call、bind是干什么的?
3 回答apply與call應(yīng)用場景
2 回答call和apply方法都要傳入this的值嗎?foo.call(100,1,2);
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網(wǎng)安備11010802030151號
購課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號
2015-06-05
好詳細(xì)。。。。。。
2015-05-14
apply and call
????它們的作用都是將函數(shù)綁定到另外一個對象上去運(yùn)行,兩者僅在定義參數(shù)方式有所區(qū)別:
???? apply(thisArg,argArray);
???? call(thisArg[,arg1,arg2…] ]);
即所有函數(shù)內(nèi)部的this指針都會被賦值為thisArg,這可實(shí)現(xiàn)將函數(shù)作為另外一個對象的方法運(yùn)行的目的
apply的說明
如果?argArray?不是一個有效的數(shù)組或者不是?arguments?對象,那么將導(dǎo)致一個?TypeError。
如果沒有提供?argArray?和?thisArg任何一個參數(shù),那么?Global?對象將被用作?thisArg,?
并且無法被傳遞任何參數(shù)。
call的說明
call方法可將一個函數(shù)的對象上下文從初始的上下文改變?yōu)橛?thisArg指定的新對象。
如果沒有提供?thisArg參數(shù),那么?Global?對象被用作?thisArg
相關(guān)技巧:
應(yīng)用call和apply還有一個技巧在里面,就是用call和apply應(yīng)用另一個函數(shù)(類)以后,當(dāng)前的函數(shù)(類)就具備了另一個函數(shù)(類)的方法或者是屬性,這也可以稱之為“繼承”。
看下面示例:
//?繼承的演示
function?base() {
????this.member = " dnnsun_Member";
????this.method =?function() {
???????? window.alert(this.member);
???? }
}
function?extend() {
?????base.call(this);
???? window.alert(member);
???? window.alert(this.method);
}
上面的例子可以看出,通過call之后,extend可以繼承到base的方法和屬性。
順便提一下,在javascript框架prototype里就使用apply來創(chuàng)建一個定義類的模式,
其實(shí)現(xiàn)代碼如下:
var?Class = {
?? create:?function() {
????returnfunction() {
??????this.initialize.apply(this, arguments);
???? }
?? }
}
解析:從代碼看,該對象僅包含一個方法:Create,其返回一個函數(shù),即類。但這也同時是類的
構(gòu)造函數(shù),其中調(diào)用initialize,而這個方法是在類創(chuàng)建時定義的初始化函數(shù)。通過如此途徑,
就可以實(shí)現(xiàn)prototype中的類創(chuàng)建模式
示例:
var?vehicle=Class.create();
vehicle.prototype.initialize= function(type)
{
????????this.type=type;
}
vehicle.prototype.showSelf= function()
{
????? alert("this vehicle is "+?this.type);
}
var?moto=new?vehicle("Moto");
moto.showSelf();
?原文http://www.cnblogs.com/Ghost-Draw-Sign/articles/1530108.html