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 相关文章推荐
List the UTC Time on a Computer
Jun 11 Javascript
利用javascript实现一些常用软件的下载导航
Aug 03 Javascript
JavaScript省市联动实现代码
Feb 15 Javascript
javascript中返回顶部按钮的实现
May 05 Javascript
JavaScript声明变量名的语法规则
Jul 10 Javascript
jQuery 中ajax异步调用的四种方式
Jun 28 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
Jan 08 Javascript
js实现3d悬浮效果
Feb 16 Javascript
vue引入swiper插件的使用实例
Jul 19 Javascript
提升页面加载速度的插件InstantClick
Sep 12 Javascript
vue项目刷新当前页面的三种方法
Dec 04 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
Dec 14 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个人网站架设连环讲(二)
2006/10/09 PHP
php缓存技术详细总结
2013/08/07 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
JS获取并操作iframe中元素的方法
2013/03/21 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
前端开发之便利店收银系统代码
2019/12/27 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
Python探索之SocketServer详解
2017/10/28 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
使用Numpy对特征中的异常值进行替换及条件替换方式
2020/06/08 Python
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
英国女装网上商店:I Saw It First
2018/10/18 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
欢送退休感言
2014/02/08 职场文书
选秀节目策划方案
2014/06/06 职场文书
奥林匹克运动会口号
2014/06/19 职场文书
九一八事变纪念日演讲稿
2014/09/14 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
休学证明范本
2015/06/19 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS