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 相关文章推荐
JS跨域代码片段
Aug 30 Javascript
zTree插件之单选下拉菜单实例代码
Nov 07 Javascript
JavaScript程序设计之JS调试
Dec 09 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
Jul 14 Javascript
微信小程序之分享页面如何返回首页的示例
Mar 28 Javascript
D3.js实现拓扑图的示例代码
Jun 30 Javascript
深入分析element ScrollBar滚动组件源码
Jan 22 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
Mar 11 Javascript
JS开发 富文本编辑器TinyMCE详解
Jul 19 Javascript
js验证密码强度解析
Mar 18 Javascript
Vue+Element自定义纵向表格表头教程
Oct 26 Javascript
微信小程序实现列表左右滑动
Nov 19 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教程 变量定义
2009/10/23 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
PHP实现批量清空删除指定文件夹所有内容的方法
2017/05/30 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
javascript中检测变量的类型的代码
2010/12/28 Javascript
js实现addClass,removeClass,hasClass的函数代码
2011/07/13 Javascript
每天一篇javascript学习小结(属性定义方法)
2015/11/19 Javascript
详解js中构造流程图的核心技术JsPlumb
2015/12/08 Javascript
Javascript操作表单实例讲解(下)
2016/06/20 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
[43:47]完美世界DOTA2联赛PWL S3 LBZS vs Phoenix 第一场 12.09
2020/12/11 DOTA
极简的Python入门指引
2015/04/01 Python
Python类的用法实例浅析
2015/05/27 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
django 修改server端口号的方法
2018/05/14 Python
Django migrations 默认目录修改的方法教程
2018/09/28 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
Python中时间datetime的处理与转换用法总结
2019/02/18 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
KEETSA环保床垫:更好的睡眠,更好的生活!
2016/11/24 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
光荣入党自我鉴定
2014/01/22 职场文书
安全资金保障制度
2014/01/23 职场文书
舞蹈教师自荐信
2014/01/27 职场文书
幼儿园中秋节活动方案2013
2014/01/29 职场文书
2014年协会工作总结
2014/11/22 职场文书
python实现简单的名片管理系统
2021/04/26 Python