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 相关文章推荐
setTimeout和setInterval的浏览器兼容性分析
Feb 27 Javascript
JQuery 简便实现页面元素数据验证功能
Mar 24 Javascript
Sample script that displays all of the users in a given SQL Server DB
Jun 16 Javascript
HTML中Select不用Disabled实现ReadOnly的效果
Apr 07 Javascript
Javascript 检测、添加、移除样式(className)函数代码
Sep 08 Javascript
关于document.cookie的使用javascript
Oct 29 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
Oct 13 Javascript
js导出excel文件的简洁方法(推荐)
Nov 02 Javascript
JavaScript中boolean类型之三种情景实例代码
Nov 21 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
Apr 22 Javascript
微信小程序 自定义Toast实例代码
Jun 12 Javascript
微信小程序实现张图片合成为一张并下载
Jul 16 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安全编程之加密功能
2006/10/09 PHP
jQuery基础知识filter()和find()实例说明
2010/07/06 Javascript
nodejs开发环境配置与使用
2014/11/17 NodeJs
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
详细解读AngularJS中的表单验证编程
2015/06/19 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
javascript瀑布流式图片懒加载实例
2020/06/28 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
es5 类与es6中class的区别小结
2020/11/09 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
python实现数通设备端口监控示例
2014/04/02 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
Python列表切片用法示例
2017/04/19 Python
python+mongodb数据抓取详细介绍
2017/10/25 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
Python使用统计函数绘制简单图形实例代码
2019/05/15 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
五年级科学教学反思
2014/02/05 职场文书
个人自我鉴定总结
2014/03/25 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
赞美老师的演讲稿
2014/05/22 职场文书
高一军训的心得体会
2014/09/01 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
垂直极限观后感
2015/06/08 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
关于Vue Router的10条高级技巧总结
2021/05/06 Vue.js
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python