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 相关文章推荐
动态改变textbox的宽高的js
Oct 26 Javascript
jQuery点击后一组图片左右滑动的实现代码
Aug 16 Javascript
jquery在IE、FF浏览器的差别详细探讨
Apr 28 Javascript
如何使用Javascript正则表达式来格式化XML内容
Jul 04 Javascript
jquery validate在ie8下的bug解决方法
Nov 13 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
Nov 25 Javascript
jQuery焦点图切换简易插件制作过程全纪录
Aug 27 Javascript
jquery实现图片切换代码
Oct 13 Javascript
图文详解Javascript中的上下文和作用域
Feb 15 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
Jan 02 jQuery
bootstrap实现tab选项卡切换
Aug 09 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
Jan 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
农民和部队如何穿矿
2020/03/04 星际争霸
完美解决PHP中文乱码
2009/11/26 PHP
php去除HTML标签实例
2013/11/06 PHP
cakephp常见知识点汇总
2017/02/24 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
JavaScript使用原型和原型链实现对象继承的方法详解
2017/04/05 Javascript
详解vue数据渲染出现闪烁问题
2017/06/29 Javascript
微信小程序如何调用json数据接口并解析
2019/06/29 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
Python连接PostgreSQL数据库的方法
2016/11/28 Python
Python基于正则表达式实现检查文件内容的方法【文件检索】
2017/08/30 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
波兰家居和花园家具专家:4Home
2019/05/26 全球购物
Crocs欧洲官网:Crocs Europe
2020/01/14 全球购物
化工专业推荐信范文
2013/11/28 职场文书
护理学专业推荐信
2013/12/03 职场文书
办公室前台岗位职责
2014/01/04 职场文书
十八大闭幕感言
2014/01/22 职场文书
2014年保卫科工作总结
2014/12/05 职场文书
幼儿园三八妇女节活动总结
2015/02/06 职场文书
鸡毛信观后感
2015/06/11 职场文书
学会掌握自己命运的十条黄金法则:
2019/08/08 职场文书
Python之基础函数案例详解
2021/08/30 Python