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 相关文章推荐
Mootools 1.2教程 设置和获取样式表属性
Sep 15 Javascript
JS实现程序暂停与继续功能代码解读
Oct 10 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
Nov 19 Javascript
举例讲解jQuery中可见性过滤选择器的使用
Apr 18 Javascript
js控制div层的叠加简单方法
Oct 15 Javascript
使用bootstrap插件实现模态框效果
May 10 Javascript
vue-cli开发时,关于ajax跨域的解决方法(推荐)
Feb 03 Javascript
Vuejs 单文件组件实例详解
Feb 09 Javascript
vue watch普通监听和深度监听实例详解(数组和对象)
Aug 16 Javascript
详解element-ui设置下拉选择切换必填和非必填
Jun 17 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
Oct 23 Javascript
Vuex的热更替如何实现
Jun 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
php通过array_merge()函数合并关联和非关联数组的方法
2015/03/18 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
JS 密码强度验证(兼容IE,火狐,谷歌)
2010/03/15 Javascript
jquery连缀语法如何实现
2012/11/29 Javascript
js之事件冒泡和事件捕获详细介绍
2013/10/28 Javascript
JQuery实现防止退格键返回的方法
2015/02/12 Javascript
JavaScript里实用的原生API汇总
2015/05/14 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
javascript操作cookie
2017/01/17 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
Vue AST源码解析第一篇
2017/07/19 Javascript
JS实现的简单表单验证功能完整实例
2017/10/14 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
vue中动态设置meta标签和title标签的方法
2018/07/11 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
原生js实现放大镜组件
2021/01/22 Javascript
python将ip地址转换成整数的方法
2015/03/17 Python
在Linux下调试Python代码的各种方法
2015/04/17 Python
python 3.7.0 下pillow安装方法
2018/08/27 Python
python和c语言的主要区别总结
2019/07/07 Python
python实现连连看辅助(图像识别)
2020/03/25 Python
如何基于python操作excel并获取内容
2019/12/24 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
Scrapy中如何向Spider传入参数的方法实现
2020/09/28 Python
HTML5 Canvas标签使用收录
2009/07/07 HTML / CSS
《三顾茅庐》教学反思
2014/04/10 职场文书
纪律教育学习心得体会
2014/09/02 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
庆祝教师节主题班会
2015/08/17 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
Oracle中日期的使用方法实例
2022/07/07 Oracle