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 YUI 读码日记之 YAHOO.util.Dom - Part.2 0
Mar 22 Javascript
Js 去掉字符串中的空格(实现代码)
Nov 19 Javascript
js中arguments,caller,callee,apply的用法小结
Jan 28 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
Aug 04 Javascript
javascript的document中的动态添加标签实现方法
Oct 24 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
Dec 26 Javascript
vue2.X组件学习心得(新手必看篇)
Jul 05 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
利用Blob进行文件上传的完整步骤
Aug 02 Javascript
vue+Element-ui实现分页效果实例代码详解
Dec 10 Javascript
JavaScript键盘事件响应顺序详解
Sep 30 Javascript
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
关于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网页显示各种语法错误
2013/09/23 PHP
php 获取页面中指定内容的实现类
2014/01/23 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 2异步获取节点)
2007/03/10 Javascript
Knockoutjs的环境搭建教程
2012/11/26 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
在Linux上用forever实现Node.js项目自启动
2014/07/09 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
2016/08/01 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
JavaScript数组和对象的复制
2017/03/21 Javascript
详解Vue-cli中的静态资源管理(src/assets和static/的区别)
2018/06/19 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
python实现马耳可夫链算法实例分析
2015/05/20 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
JPA的特点
2014/10/25 面试题
建材业务员岗位职责
2013/12/08 职场文书
大学生党课思想汇报
2013/12/29 职场文书
运动会跳远广播稿
2014/02/04 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
学校安全防火方案
2014/06/07 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
结婚保证书
2015/01/16 职场文书
万能检讨书
2015/01/27 职场文书
碧霞祠导游词
2015/02/09 职场文书
实习单位推荐信
2015/03/27 职场文书
Python函数中apply、map、applymap的区别
2021/11/27 Python
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js