javascript的apply和call方法的使用详解

一直对javascript的apply和call方法的使用比较模糊,前段时间在研究angularjs的源代码时,发现这两个方法非常的强大,使用的场景非常多,这里做个总结。

apply和call都是对某个方法的应用,区别在于apply有两个参数:apply(obj,args),其中obj为方法应用的对象,args为参数数组;call有多个参数,call(obj,arg1,arg2,arg3......),obj和apply的obj一样,而参数则是用逗号隔开,有多少个参数就传多少个。下面以apply为例,需要注意的是apply的第二个参数必须为数组,否则会报错。

1.obj为null、undefined、bool值、0、this、window等的时候,相当于调用方法自身。

function test(arg) {
console.log(arg);
}

分别调用test.apply(null,[1,2,3]),test.apply(undefined,[1,2,3]),test.apply(false,[1,2,3]),test.apply(true,[1,2,3]),

test.apply(0,[1,2,3]),test.apply(this,[1,2,3]);

输出结果都为1。

ps:test函数只有一个参数,所以即使传入的数组参数多于一个,也只会取第一个,其它的被忽略。

2.obj为不存在的对象时,会报错。仍然以上一个函数为例。

调用test.apply(ffff,[1,2,3]),则直接报错。

输出:Uncaught ReferenceError: ffff is not defined。

3.obj为函数时,如XXX.apply(obj,args),意为调用XXX函数。

function test1(arg) {
console.log("test1 " + arg);
}

function test2(arg1, arg2) {
console.log(arg1 + " " + arg2);
}

调用test1.apply(test2, [1, 2, 3]);

输出:test1 1。

可以看见,其实就是将参数传给test1然后调用test1。

4.当obj为对象时,obj对象会替代XXX.apply中的XXX函数的this,将this所拥有的属性变成obj对象自己的属性。

例1:

function Test1() {
console.log("test1 ");

this.a = 1;
this.b = 2;

}

var c ={};

Test1.apply(c, []);

此时的c对象为{a:1,b:2}。

例2:

function Test1() {
console.log("test1 ");

this.a = 1;
this.b = 2;
}

Test1.prototype = {c: 3, d: 4};

var c = Test1.prototype;
Test1.apply(c, []);

此时的c对象为{a:1,b:2,c:3,d:4}。

另外,如果函数有返回值,给apply的结果赋一个变量即可获得。

function test1() {
console.log("test1");

return function () {
console.log("return function");
}
}

var back = test1.apply(null, []);
back();

输出:return function。

目前对apply的了解就这么多,call的调用类似,只需要把数组换成逗号分隔的单个参数即可。如果各位有其它使用方式或者发现问题,烦请指正赐教。

时间: 2024-07-29 21:26:26

javascript的apply和call方法的使用详解的相关文章

Android编程之Fragment动画加载方法源码详解

上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

jQuery().on方法的使用详解

从厦门回来之后,两周没写博客了,主要是没时间,先放一张在厦门的靓照 本文 原文链接 ,希望能帮到这些前端小白.用法:此方法可以在匹配元素上绑定一个或者多个事件处理函数. 使用off()方法可以删除on()方法绑定的事件. 语法结构一 1 $(selector).on(events,[selector],[data],fn) events:一个或多个用空格分隔的事件类型和可选的命名空间. selector:可选.一个选择器字符串,用以过滤选定的元素,该选择器的子元素将调用处理程序. data:可选

javascript 中 apply(或call)方法的用途----对象的继承

一直以来,我的理解就是  js中的Function.apply(或者是Function.call)方法是来改变Function 这个函数的执行上下文(excute Context),说白了,就是改变执行时函数所处的作用域, 最直接的就是影响到 this 这个预定义的变量的值.!!Function.apply(obj, arguments),就是改变 function 的执行环境为 传入的obj 对象,即 Funtion 内部的this 会被改变为 obj. 下面的这个例子是搜索别人的例子的. 先

关于javascript中apply()和call()方法的区别

如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语言过程中遇到这种感觉,那么就从现在形始,请放下的您的”偏见”,因为这对您来说绝对是一片新大陆,让JavaScrip 好,言归正传,先理解JavaScrtipt动态变换运行时上下文特性,这种特性主要就体现在apply, call两个方法的运用上. 区分apply,call就一句话, foo.call(

javascript中apply,call,bind方法

apply,call应该是我们比较熟悉的方法,像Math.max.apply(arr),取数组元素中的最大值,Array.prototype.slice.call(obj)把obj变为数组等方法已经说明了apply及call的使用, 这两者在性能上并无区别,只不过在后面参数上有一定差异,apply的参数是数组形式,而call则是单个元素的形式,譬如我们在网上看到的最常见的add.call(sub,3,1)则是成功调用add方法,得到结果4.当然,call方法也在函数中可以实现类似的多继承问题在网

关于javascript中apply()和call()方法

ref:http://www.popo4j.com/article/the-differences-of-apply-and-call.html 如果没接触过动态语言,以编译型语言的思维方式去理解javaScript将会有种神奇而怪异的感觉,因为意识上往往不可能的事偏偏就发生了,甚至觉得不可理喻.如果在学JavaScript这自由而变幻无穷的语言过程中遇到这种感觉,那么就从现在形始,请放下的您的”偏见”,因为这对您来说绝对是一片新大陆,让JavaScrip 好,言归正传,先理解JavaScrti

JavaScript的apply和call方法及其区别

参考资料: http://blog.csdn.net/myhahaxiao/article/details/6952321 apply和call能“劫持”其他对象的方法来执行,其形参如下: apply(obj, array parameters) call(obj,  parameter1,parameter2,...) 示例: /*定义一个人类*/ function Person(name,age) { this.name=name; this.age=age; } /*定义一个学生类*/ f

javascript中apply()和call()方法的区别

一.方法的定义 call方法: 语法:call(thisObj,Object)定义:调用一个对象的一个方法,以另一个对象替换当前对象.说明:call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj. apply方法: 语法:apply(thisObj,[argArray])定义:应用某一对象的一个方法,用另一个对象替换当前对象.

javascript中apply()和call()方法及区别

call()和apply()方法 1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call 方法可以用来代替另一个对象调用一个方法.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象. 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj. apply方法: 语法:apply([thi