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系列(47):对象创建模式(上篇)
Mar 04 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
Jun 04 Javascript
javascript实现倒计时并弹窗提示特效
Jun 05 Javascript
jquery validate表单验证的基本用法入门
Jan 18 Javascript
微信小程序入门教程
Nov 18 Javascript
AngularJS封装$http.post()实例详解
May 06 Javascript
微信小程序分页加载的实例代码
Jul 11 Javascript
Vue-Router进阶之滚动行为详解
Sep 13 Javascript
Vue 项目分环境打包的方法示例
Aug 03 Javascript
js隐式转换的知识实例讲解
Sep 28 Javascript
Vue页面渲染中key的应用实例教程
Jan 12 Vue.js
详解JSON.parse和JSON.stringify用法
Feb 18 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
ASP知识讲座四
2006/10/09 PHP
PHP 采集程序原理分析篇
2010/03/05 PHP
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
实例讲解PHP验证邮箱是否合格
2019/01/28 PHP
基于jquery实现等比缩放图片
2014/12/03 Javascript
jQuery中appendTo()方法用法实例
2015/01/08 Javascript
使用angular写一个hello world
2015/01/23 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
使用jquery.qrcode.min.js实现中文转化二维码
2016/03/11 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
利用JS实现简单的瀑布流加载图片效果
2017/04/22 Javascript
react-router中的属性详解
2017/06/01 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
ionic3双击返回退出应用的方法
2019/09/17 Javascript
Python基于PycURL实现POST的方法
2015/07/25 Python
Python读写txt文本文件的操作方法全解析
2016/06/26 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
python能做哪些生活有趣的事情
2020/09/09 Python
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
Currentbody法国:健康与美容高科技产品
2020/08/16 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
公司中层干部的自我评价分享
2014/03/01 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
机械设计及其自动化专业求职信
2014/06/09 职场文书
学用政策心得体会
2014/09/10 职场文书
工程承包协议书
2014/10/20 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
施工员岗位职责范本
2015/04/11 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
mysql 带多个条件的查询方式
2021/06/05 MySQL
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python