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 相关文章推荐
Javascript的IE和Firefox兼容性汇编
Jul 01 Javascript
javascript JSON操作入门实例
Apr 16 Javascript
jQuery autocomplate 自扩展插件、自动完成示例代码
Mar 28 Javascript
广泛收集的jQuery拖放插件集合
Apr 09 Javascript
分享两款带遮罩的jQuery弹出框
Dec 30 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 Javascript
Angular2数据绑定详解
Apr 18 Javascript
linux 后台运行node服务指令方法
May 23 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
Apr 07 Javascript
详解Vuex下Store的模块化拆分实践
Jul 31 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
May 13 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
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
2009/06/08 PHP
php正则表达匹配中文问题分析小结
2012/03/25 PHP
WordPress的主题编写中获取头部模板和底部模板
2015/12/28 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
基于PHP实现发微博动态代码实例
2020/12/11 PHP
RGB颜色值转HTML十六进制(HEX)代码的JS函数
2009/04/25 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
「中高级前端面试」JavaScript手写代码无敌秘籍(推荐)
2019/04/08 Javascript
详解微信小程序实现跑马灯效果(附完整代码)
2019/04/29 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
用python找出那些被“标记”的照片
2017/04/20 Python
Python 3.6 性能测试框架Locust安装及使用方法(详解)
2017/10/11 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
2020/09/03 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
Python 爬取淘宝商品信息栏目的实现
2021/02/06 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
Html5+JS实现手机摇一摇功能
2015/04/24 HTML / CSS
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
毕业生找工作的求职信范文
2013/12/24 职场文书
七年级地理教学反思
2014/01/26 职场文书
群众路线剖析材料
2014/02/02 职场文书
客户接待方案
2014/02/26 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
单位接收函范文
2015/01/30 职场文书
2014年度个人工作总结范文
2015/03/09 职场文书
专项资金申请报告
2015/05/15 职场文书
运动会800米赞词
2015/07/22 职场文书
springboot使用Redis作缓存使用入门教程
2021/07/25 Redis