apply和call方法定义及apply和call方法的区别


Posted in Javascript onNovember 15, 2015

 如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语言过程中遇到这种感觉,那么就从现在形始,请放下的您的”偏见”,因为这对您来说绝对是一片新大陆。好了,不给大家唠嗑了,言归正传吧,先给大家讲下apply和call方法的定义。

具体内容如下所示:

1、方法定义

call, apply都属于Function.prototype的一个方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法都有call, apply属性.既然作为方法的属性,那它们的使用就当然是针对方法的了.这两个方法是容易混淆的,因为它们的作用一样,只是使用方式不同.

call方法:

语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]])

定义:调用一个对象的一个方法,以另一个对象替换当前对象。

说明:

call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:

语法:apply([thisObj[,argArray]])

定义:应用某一对象的一个方法,用另一个对象替换当前对象。

说明:

如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。

如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数

call, apply作用就是借用别人的方法来调用,就像调用自己的一样.

它们的不同之处:

apply:最多只能有两个参数——新this对象和一个数组 argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里面。如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

call:则是直接的参数列表,主要用在js对象各方法互相调用的时候,使当前this实例指针保持一致,或在特殊情况下需要改变this指针。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

更简单地说,apply和call功能一样,只是传入的参数列表形式不同:如 func.call(func1,var1,var2,var3)对应的apply写法为:

func.apply(func1,[var1,var2,var3])

如:

add.apply(sub,[3,1]);
//add.call(sub,3,1);
var a={
n:1,
m:2,
add:function(){
return this.n+this.m;
}
}
var b={n:3,m:4
}
console.log(a.add.call(b));//b.n+b.m=7
function Animal(){ 
this.name = "Animal"; 
this.showName = function(){ 
alert(this.name); 
} 
}
function Cat(){ 
this.name = "Cat"; 
} 
var animal = new Animal(); 
var cat = new Cat(); 
//通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。 
//输入结果为"Cat" 
animal.showName.call(cat,","); 
animal.showName.apply(cat,[]);

以上内容是小编给大家介绍的apply和call方法定义及apply和call方法的区别,希望大家喜欢。

Javascript 相关文章推荐
javascript 嵌套的函数(作用域链)
Mar 15 Javascript
JS模板实现方法
Apr 03 Javascript
jquery用offset()方法获得元素的xy坐标
Sep 06 Javascript
JQuery自适应窗口大小导航菜单附源码下载
Sep 01 Javascript
深入探讨javascript函数式编程
Oct 11 Javascript
JavaScript中三种异步上传文件方式
Mar 06 Javascript
AngularJS 遇到的小坑与技巧小结
Jun 07 Javascript
基于滚动条位置判断的简单实例
Dec 14 Javascript
Vue2.0 实现单选互斥的方法
Apr 13 Javascript
微信小程序数据分析之自定义分析的实现
Aug 17 Javascript
vuex刷新后数据丢失的解决方法
Oct 18 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
Nov 15 #Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
Nov 15 #Javascript
JS使用eval解析JSON的注意事项分析
Nov 14 #Javascript
js读取并解析JSON类型数据的方法
Nov 14 #Javascript
基于JS实现PHP的sprintf函数实例
Nov 14 #Javascript
javascript动态生成树形菜单的方法
Nov 14 #Javascript
node.js回调函数之阻塞调用与非阻塞调用
Nov 13 #Javascript
You might like
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
PHP实现C#山寨ArrayList的方法
2015/07/16 PHP
PHP发送短信代码分享
2015/08/11 PHP
php中preg_match的isU代表什么意思
2015/10/01 PHP
jQuery图片预加载 等比缩放实现代码
2011/10/04 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
php跨域调用json的例子
2013/11/13 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
基于JavaScript实现网页倒计时自动跳转代码
2015/12/28 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
Vue.js开发环境搭建
2016/11/10 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
解决VUE中document.body.scrollTop为0的问题
2018/09/15 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
python数据清洗系列之字符串处理详解
2017/02/12 Python
Python之list对应元素求和的方法
2018/06/28 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
Django admin model 汉化显示文字的实现方法
2019/08/12 Python
python3的pip路径在哪
2020/06/23 Python
Python numpy矩阵处理运算工具用法汇总
2020/07/13 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
Java程序员面试90题
2013/10/19 面试题
运动会广播稿20字
2014/02/18 职场文书
教研活动总结
2014/04/28 职场文书
建设投标担保书
2014/05/13 职场文书
汽车广告策划方案
2014/05/31 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
大学生创业计划书
2019/06/24 职场文书
详解Python牛顿插值法
2021/05/11 Python