課程
/前端開發
/JavaScript
/JavaScript深入淺出
在您的實例中使用call方法和apply方法有什么區別?使用時應注意什么您可以詳細講解一下嗎?
2015-05-14
源自:JavaScript深入淺出 9-1
正在回答
好詳細。。。。。。
apply and call
????它們的作用都是將函數綁定到另外一個對象上去運行,兩者僅在定義參數方式有所區別:
???? apply(thisArg,argArray);
???? call(thisArg[,arg1,arg2…] ]);
即所有函數內部的this指針都會被賦值為thisArg,這可實現將函數作為另外一個對象的方法運行的目的
apply的說明
如果?argArray?不是一個有效的數組或者不是?arguments?對象,那么將導致一個?TypeError。如果沒有提供?argArray?和?thisArg任何一個參數,那么?Global?對象將被用作?thisArg,?并且無法被傳遞任何參數。
call的說明
call方法可將一個函數的對象上下文從初始的上下文改變為由?thisArg指定的新對象。如果沒有提供?thisArg參數,那么?Global?對象被用作?thisArg
相關技巧:
應用call和apply還有一個技巧在里面,就是用call和apply應用另一個函數(類)以后,當前的函數(類)就具備了另一個函數(類)的方法或者是屬性,這也可以稱之為“繼承”。
看下面示例:
//?繼承的演示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來創建一個定義類的模式,
其實現代碼如下:
var?Class = {?? create:?function() {????returnfunction() {??????this.initialize.apply(this, arguments);???? }?? }}
解析:從代碼看,該對象僅包含一個方法:Create,其返回一個函數,即類。但這也同時是類的構造函數,其中調用initialize,而這個方法是在類創建時定義的初始化函數。通過如此途徑,就可以實現prototype中的類創建模式
示例:
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
舉報
由淺入深學習JS語言特性,且解析JS常見誤區,從入門到掌握
1 回答bind,call,apply,的作用有區別嗎?
1 回答call和apply
1 回答apply、call、bind是干什么的?
3 回答apply與call應用場景
2 回答call和apply方法都要傳入this的值嗎?foo.call(100,1,2);
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2015-06-05
好詳細。。。。。。
2015-05-14
apply and call
????它們的作用都是將函數綁定到另外一個對象上去運行,兩者僅在定義參數方式有所區別:
???? apply(thisArg,argArray);
???? call(thisArg[,arg1,arg2…] ]);
即所有函數內部的this指針都會被賦值為thisArg,這可實現將函數作為另外一個對象的方法運行的目的
apply的說明
如果?argArray?不是一個有效的數組或者不是?arguments?對象,那么將導致一個?TypeError。
如果沒有提供?argArray?和?thisArg任何一個參數,那么?Global?對象將被用作?thisArg,?
并且無法被傳遞任何參數。
call的說明
call方法可將一個函數的對象上下文從初始的上下文改變為由?thisArg指定的新對象。
如果沒有提供?thisArg參數,那么?Global?對象被用作?thisArg
相關技巧:
應用call和apply還有一個技巧在里面,就是用call和apply應用另一個函數(類)以后,當前的函數(類)就具備了另一個函數(類)的方法或者是屬性,這也可以稱之為“繼承”。
看下面示例:
//?繼承的演示
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來創建一個定義類的模式,
其實現代碼如下:
var?Class = {
?? create:?function() {
????returnfunction() {
??????this.initialize.apply(this, arguments);
???? }
?? }
}
解析:從代碼看,該對象僅包含一個方法:Create,其返回一個函數,即類。但這也同時是類的
構造函數,其中調用initialize,而這個方法是在類創建時定義的初始化函數。通過如此途徑,
就可以實現prototype中的類創建模式
示例:
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