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 相关文章推荐
asp(javascript)全角半角转换代码 dbc2sbc
Aug 06 Javascript
Js操作树节点自动折叠展开的几种方法
May 05 Javascript
如何用JavaScript定义一个类
Sep 12 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 Javascript
js淡入淡出焦点图幻灯片效果代码分享
Sep 08 Javascript
jQuery实现的文字hover颜色渐变效果实例
Feb 20 Javascript
JavaScript:Array类型全面解析
May 19 Javascript
jQuery基于ajax操作json数据简单示例
Jan 05 Javascript
javaScript实现复选框全选反选事件详解
Nov 20 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
Jul 27 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
Aug 13 Javascript
利用不到200行代码写一款属于你自己的js类库
Jul 08 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中循环语句的用法介绍
2012/01/30 PHP
PHP 年龄计算函数(精确到天)
2012/06/07 PHP
php中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
2015/07/01 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
基于PHP实现通过照片获取ip地址
2016/04/26 PHP
PHP程序守护进程化实现方法详解
2020/07/16 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
js类中的公有变量和私有变量
2008/07/24 Javascript
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
JS实现漂亮的淡蓝色滑动门效果代码
2015/09/23 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
详解vue2 $watch要注意的问题
2017/09/08 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
[44:30]完美世界DOTA2联赛PWL S2 GXR vs Magma 第一场 11.25
2020/11/26 DOTA
Python的time模块中的常用方法整理
2015/06/18 Python
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
详解使用python爬取抖音app视频(appium可以操控手机)
2021/01/26 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
英国第一蛋白粉品牌:Myprotein
2016/09/14 全球购物
会计电算化专业应届大学生求职信
2013/10/22 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
跑吧孩子观后感
2015/06/10 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
PC版《死亡搁浅导剪版》现已发售 展开全新的探险
2022/04/03 其他游戏
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技