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 相关文章推荐
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
Apr 27 Javascript
javascript 随机展示头像实现代码
Dec 06 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
Jul 31 Javascript
Java File类的常用方法总结
Mar 18 Javascript
基于jQuery实现美观且实用的倒计时实例代码
Dec 30 Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 Javascript
从0开始学Vue
Oct 27 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
jQuery表单验证之密码确认
May 22 jQuery
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
浅析 Vue 3.0 的组装式 API(一)
Aug 31 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 email邮箱正则
2008/10/08 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
2013/09/16 PHP
PHP基于CURL进行POST数据上传实例
2014/11/10 PHP
详解PHP数据压缩、加解密(pack, unpack)
2016/12/17 PHP
php使用curl伪造浏览器访问操作示例
2019/09/30 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
JS完成代码前最好对其做5件事
2013/04/07 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
懒加载实现的分页&&网站footer自适应
2016/12/21 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
vue 2.8.2版本配置刚进入时候的默认页面方法
2018/09/21 Javascript
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
webpack4+react多页面架构的实现
2018/10/25 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
JavaScript 几种循环方式以及模块化的总结
2020/09/03 Javascript
javascript实现一款好看的秒表计时器
2020/09/05 Javascript
分享一下Python 开发者节省时间的10个方法
2015/10/02 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
python 实现多维数组(array)排序
2020/02/28 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
把富文本的回车转为br标签
2019/08/09 HTML / CSS
HTML5标签大全
2016/11/23 HTML / CSS
竞选村长演讲稿
2014/04/28 职场文书
见习报告的格式
2014/11/04 职场文书
职工年度考核评语
2014/12/31 职场文书
上学路上观后感
2015/06/16 职场文书
情况说明书怎么写
2015/10/08 职场文书
Kubernetes部署实例并配置Deployment、网络映射、副本集
2022/04/01 Servers