javascript call和apply
每个函数都包含两个非继承而来的方法:call和apply.
我们可以通过这两个方法来间接调用函数。可以这样:
f.call(o);
f.apply(o);
//o对象间接调用了f函数
这与下面的功能相似:
o.m = f;
o.m();
delete o.m//删除临时方法
语法:
fn.call(obj,arg1,arg2,arg3...) fn.apply(obj,[arry]/arguments) [apply中第二个参数可以使纯数组也可以是类数组]
在es5严格模式下,第一个参数都会变成this值;而在es3和非严格模式下,undefined和null被全局对象所代替,其他原始值则会被相应的包装的对象所替代。
“call和apply最强大的地方是能够扩充函数赖以运行的作用域”,很多博客文章中都是这样描述的,其实这种说法是错误的,绝对是错误的!所以我不用“误区”这个词语了。因为JS是静态词法作用域,是按照语法定义来确定作用域,它的作用域其实是无法扩充的,而this 是 context,可以改变 ,call和apply改变的是this,改变的是上下文!
下面是一个例子:
var name = "复读机",
age = ;
function say(){
console.log("name : " + this.name);
console.log("age : " + this.age);
}
var obj = {
name : "bb机",
age :
}
say(); //name : 复读机 age : 25
say.call(obj);//name : bb机 age : 30
如果我们不使用call方法,我们是怎么用obj调用say这个函数的呢
var name = "复读机",
age = ;
function say(){
console.log("name : " + this.name);
console.log("age : " + this.age);
}
var obj = {
name : "bb机",
age :
}
say(); //name : 复读机 age : 25
obj.say = say;
obj.say();//name : bb机 age : 30
可以看出用call将会更方便!
或许我们使用过require框架中的require函数,觉得非常神奇!它可以将一个数组依次传入一个回调函数的参数中,其实它的模型非常简单!
下面是例子:
var noop = function(){};
function require(list,fn){
fn.apply(noop,list);
}
require([,,],function(a,b,c){
console.log(a);
console.log(b);
console.log(c);
})
今天到此为止哈。。
javascript call和apply的更多相关文章
- javascript call与apply关键字的作用
apply接受两个参数.第一个参数指定函数体内this对象的指向,第二个参数为一个带下标的集合. call则是apply的语法糖,如果参数数量固定,则可以不用带下标的集合传第二个参数. 1 2 3 4 ...
- 《JavaScript总结》apply、call和bind方法
在JavaScript中,apply.call.bind这个三个方法,它们的作用都是为了改变某个函数运行时的上下文, 也就是改变函数体内的this指向. 在一个函数里,存在“定义时上下文”.“运行时上 ...
- javascript中call,apply,bind的用法对比分析
这篇文章主要给大家对比分析了javascript中call,apply,bind三个函数的用法,非常的详细,这里推荐给小伙伴们. 关于call,apply,bind这三个函数的用法,是学习java ...
- JavaScript中的apply,call与this的纠缠
1.apply定义 apply:调用函数,并用指定对象替换函数的 this 值,同时用指定数组替换函数的参数. 语法:apply([thisObj[,argArray]]) thisObj 可选.要用 ...
- Javascript中的apply与call详解
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别. 一.方法定义 1.call 方法 语法:call([thisObj[,arg1[, arg2[, [,.arg ...
- JavaScript方法call,apply,caller,callee,bind的使用详解及区别
一.call 方法 调用一个对象的一个方法,以另一个对象替换当前对象(其实就是更改对象的内部指针,即改变对象的this指向的内容). 即 “某个方法”当做“指定的某个对象”的“方法”被执行. Js代 ...
- JavaScript中的apply和call函数详解(转)
每个JavaScript函数都会有很多附属的(attached)方法,包括toString().call()以及apply().听起来,你是否会感到奇怪,一个函数可能会有属于它自己的方法,但是记住,J ...
- javascript篇-----函数apply()和call()
转自:http://www.jb51.net/article/28013.htm 如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的 ...
- JavaScript基础插曲---apply,call和URL编码等方法
Js基础学习 Js的压缩: 就是利用js的语法格式通过缩短变量名,去掉空格等来进行压缩. Apply和call的使用 1:apply方法:应用某一对象的方法,用于一个对象替换当前对象.主要是改变thi ...
- JavaScript中call,apply和prototype
[TOC] call()方法 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 如果没有提供 thi ...
随机推荐
- Simditor图片上传
上一篇文章(Simditor用法)仅仅是简单的默认配置,我们可自己定义工具栏button使其更丰富和实现上传图片功能 初始化编辑器 <script type="text/javascr ...
- Unity3D 如何图形问题修正旋转模型已导入?
如何纠正旋转模型被导入? 一些立体艺术资源包导出其模式,以便 Z 轴向上.Unity 大多数标准的脚本中假定的三维世界 Y 轴代表了.在 Unity 比改动脚本使其契合easy得多. Z 轴朝上 ...
- Chain of Responsibility - 责任链模式
定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比方如今有一个图形界面,它包含一个应用Application类,一个主窗体Window,一个buttonButton ...
- PHP-5.5.10+Apache httpd-2.4.9在Windows系统下配置实战
原文 PHP-5.5.10+Apache httpd-2.4.9在Windows系统下配置实战 环境配置: 程序准备: PHP windows版本下载地址: http://windows.php. ...
- Cannot update paths and switch to branch at the same time(转)
当使用git进行操作: git checkout -b local-name origin/remote-name 出现错误: fatal: git checkout: updating paths ...
- RQNOJ PID2 / 开心的金明
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N 元钱就行”.今 ...
- AJAX 怎样在一个UpDatePanel中刷新另一个updatePanel
原文:AJAX 怎样在一个UpDatePanel中刷新另一个updatePanel 在页面上(.aspx)<asp:UpdatePanel ID="MyID1" runat= ...
- 如何让虚拟机识别插入的USB闪存驱动器
首先,打开虚拟机,再就是工具栏 有一台虚拟机 -> 移动设备 -> usb ->欧克. 版权声明:本文博主原创文章,博客,未经同意不得转载.
- Moq 和RhinoMocks
Moq & RhinoMocks 使用Mock对象进行测试一般都会有以下三个关键步骤: 使用接口来描述需要测试的对象 为实际的产品代码实现这个接口 以测试为目的,在Mock对象中实现这个接口 ...
- 使用ArcGIS API for Silverlight实现地形坡度在线分析
原文:使用ArcGIS API for Silverlight实现地形坡度在线分析 苦逼的研究生课程终于在今天结束了,也许从今以后再也不会坐在大学的课堂上正式的听老师讲课了,接下来的时间就得开始找工作 ...