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中暂停功能的实现代码
Mar 04 Javascript
js实现翻页后保持checkbox选中状态的实现方法
Nov 03 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
Dec 13 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
JS中数组重排序方法
Nov 11 Javascript
js select下拉联动 更具级联性!
Apr 17 Javascript
node.js-v6新版安装具体步骤(分享)
Sep 06 Javascript
基于twbsPagination.js分页插件使用心得(分享)
Oct 21 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
Jun 01 Javascript
Vue动态获取width的方法
Aug 22 Javascript
JavaScript中如何调用Java方法
Sep 16 Javascript
JS中如何优雅的使用async await详解
Oct 05 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编程中的__clone()方法使用详解
2015/11/27 PHP
php自定义分页类完整实例
2015/12/25 PHP
PHP进阶学习之Geo的地图定位算法详解
2019/06/19 PHP
js控制淡入淡出示例代码
2013/11/12 Javascript
css结合js制作下拉菜单示例代码
2014/02/27 Javascript
jQuery简单实现禁用右键菜单
2015/03/10 Javascript
完美兼容多浏览器的js判断图片路径代码汇总
2015/04/17 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
解读ES6中class关键字
2017/11/20 Javascript
vue-cli3 karma单元测试的实现
2019/01/18 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
原生js中运算符及流程控制示例详解
2021/01/05 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
Python实现将Excel转换为json的方法示例
2017/08/05 Python
Python3操作SQL Server数据库(实例讲解)
2017/10/21 Python
对python中的for循环和range内置函数详解
2018/04/17 Python
Django中使用极验Geetest滑动验证码过程解析
2019/07/31 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Python列表元素常见操作简单示例
2019/10/25 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
python mysql 字段与关键字冲突的解决方式
2020/03/02 Python
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
出纳的岗位职责
2013/11/09 职场文书
机修工工作职责
2014/02/21 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
倡议书格式范文
2014/04/14 职场文书
教师一岗双责责任书
2014/04/16 职场文书
公安局副政委班子个人对照检查材料
2014/10/04 职场文书
员工福利申请报告
2015/05/15 职场文书
廉洁自律证明
2015/06/24 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android