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 短路法代码精简
Aug 20 Javascript
jquery中输入验证中一个不错的效果
Aug 21 Javascript
Js四则运算函数代码
Jul 21 Javascript
JavaScript中的匀速运动和变速(缓冲)运动详细介绍
Nov 11 Javascript
通过实例理解javascript中没有函数重载的概念
Jun 03 Javascript
jquery中checkbox使用方法简单实例演示
Nov 24 Javascript
js实现微信分享代码
Oct 11 Javascript
简单谈谈JS数组中的indexOf方法
Oct 13 Javascript
利用vue+elementUI实现部分引入组件的方法详解
Nov 22 Javascript
小程序调用微信支付的方法
Sep 26 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
Apr 26 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 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
PHP中用接口、抽象类、普通基类实现“面向接口编程”与“耦合方法”简述
2011/03/23 PHP
php 获取百度的热词数据的代码
2012/02/18 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
2018/06/20 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
laravel异步监控定时调度器实例详解
2019/06/21 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
jquery offset函数应用实例
2012/11/14 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
JS前端笔试题分析
2016/12/19 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
js注册时输入合法性验证方法
2017/10/21 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
封装 axios+promise通用请求函数操作
2020/08/11 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
Numpy实现卷积神经网络(CNN)的示例
2020/10/09 Python
用Python 执行cmd命令
2020/12/18 Python
VICHY薇姿英国官网:全球专业敏感肌护肤领先品牌
2017/07/04 全球购物
英文简历中的自我评价用语
2013/12/09 职场文书
教学实习自我评价
2014/01/28 职场文书
土建专业毕业生自荐书
2014/07/04 职场文书
档案工作个人总结
2015/03/03 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
交通事故代理词范文
2015/05/23 职场文书
离婚律师函范本
2015/05/27 职场文书
比赛主持人开场白
2015/05/29 职场文书
冰雪公主观后感
2015/06/16 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
python爬虫框架feapde的使用简介
2021/04/20 Python
详细分析PHP7与PHP5区别
2021/06/26 PHP