JavaScript中的apply()方法和call()方法使用介绍


Posted in Javascript onJuly 25, 2012

1、每个函数都包含两个非继承而来的方法:apply()和call()。
2、他们的用途相同,都是在特定的作用域中调用函数。
3、接收参数方面不同,apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
call()方法第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。

例1:

window.firstName = "diz"; 
window.lastName = "song"; 
var myObject = { firstName: "my", lastName: "Object" }; 
function HelloName() { 
console.log("Hello " + this.firstName + " " + this.lastName, " glad to meet you!"); 
} 
HelloName.call(window); //huo .call(this); 
HelloName.call(myObject);

运行结果为:
Hello diz song glad to meet you!
Hello my Object glad to meet you!

例2:

function sum(num1, num2) { 
return num1 + num2; 
} 
console.log(sum.call(window, 10, 10)); //20 
console.log(sum.apply(window,[10,20])); //30

分析:在例1中,我们发现apply()和call()的真正用武之地是能够扩充函数赖以运行的作用域,如果我们想用传统的方法实现,请见下面的代码:

window.firstName = "diz"; 
window.lastName = "song"; 
var myObject = { firstName: "my", lastName: "Object" }; 
function HelloName() { 
console.log("Hello " + this.firstName + " " + this.lastName, " glad to meet you!"); 
} 
HelloName(); //Hello diz song glad to meet you! 
myObject.HelloName = HelloName; 
myObject.HelloName(); //Hello my Object glad to meet you!

见加红的代码,我们发现,要想让HelloName()函数的作用域在对象myObject上,我们需要动态创建myObject的HelloName属性,此属性作为指针指向HelloName()函数,这样,当我们调用myObject.HelloName()时,函数内部的this变量就指向myObjecct,也就可以调用该对象的内部其他公共属性了。

通过分析例2,我们可以看到call()和apply()函数的真正运用之处,在实际项目中,还需要根据实际灵活加以处理!

一个小问题:再看一看函数中定义函数时,this变量的情况

function temp1() { 
console.log(this); //Object {} 
function temp2() { 
console.log(this); //Window 
} 
temp2(); 
} 
var Obj = {}; 
temp1.call(Obj); //运行结果见上面绿色的注释!!!!

执行结果与下面的相同:

function temp1() { 
console.log(this); 
temp2(); 
} 
function temp2() { 
console.log(this); 
} 
var Obj = {}; 
temp1.call(Obj);

4、bind()方法

支持此方法的浏览器有IE9+、Firefox4+、Safari5.1+、Opera12+、Chrome。它是属于ECMAScript5的方法。直接看例子:

window.color = "red"; 
var o = { color: "blue" }; 
function sayColor(){ 
alert(this.color); 
} 
var OSayColor = sayColor.bind(o); 
OSayColor(); //blue

这里,sayColor()调用bind()方法,并传入o对象,返回了OSayColor()函数,在OSayColor()中,this的值就为o对象。

Javascript 相关文章推荐
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
jquery 子窗口操作父窗口的代码
Sep 21 Javascript
js输入框邮箱自动提示功能代码实现
Dec 10 Javascript
jquery图片轮播特效代码分享
Apr 20 Javascript
js简单实现图片延迟加载的方法
Jul 19 Javascript
Angular2使用Angular-CLI快速搭建工程(二)
May 21 Javascript
详解JS中的柯里化(currying)
Aug 17 Javascript
js定时器实现倒计时效果
Nov 05 Javascript
浅谈vue 单文件探索
Sep 05 Javascript
浅谈Javascript中的对象和继承
Apr 19 Javascript
微信小程序实现左侧滑动导航栏
Apr 08 Javascript
在Vue mounted方法中使用data变量详解
Nov 05 Javascript
关于JavaScript中原型继承中的一点思考
Jul 25 #Javascript
原生js 秒表实现代码
Jul 24 #Javascript
javascript设计模式 接口介绍
Jul 24 #Javascript
javascript设计模式 封装和信息隐藏(上)
Jul 24 #Javascript
js+xml生成级联下拉框代码
Jul 24 #Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
Jul 24 #Javascript
基于jquery的跟随屏幕滚动代码
Jul 24 #Javascript
You might like
开源SNS系统-ThinkSNS
2008/05/18 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
phpwind放自动注册方法
2006/12/02 Javascript
通过JAVASCRIPT读取ASP设定的COOKIE
2007/02/15 Javascript
用javascript做拖动布局的思路
2008/05/31 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
jQuery.form插件的使用及跨域异步上传文件
2016/04/27 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
在create-react-app中使用css modules的示例代码
2018/07/31 Javascript
angularJs自定义过滤器实现手机号信息隐藏的方法
2018/10/08 Javascript
[59:59]EG vs IG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python中return语句用法实例分析
2015/08/04 Python
python如何实现反向迭代
2018/03/20 Python
Python发送http请求解析返回json的实例
2018/03/26 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
python设置环境变量的作用和实例
2019/07/09 Python
关于pytorch中全连接神经网络搭建两种模式详解
2020/01/14 Python
Django values()和value_list()的使用
2020/03/31 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
清除canvas画布内容(点擦除+线擦除)
2020/08/12 HTML / CSS
工程地质勘察专业大学生求职信
2013/10/13 职场文书
对标管理实施方案
2014/03/12 职场文书
国家励志奖学金个人先进事迹材料
2014/05/04 职场文书
教师读书活动总结
2014/05/07 职场文书
导师推荐信范文
2014/05/09 职场文书
售后服务承诺书怎么写
2014/05/21 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
党小组考察意见
2015/06/02 职场文书
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js