在JavaScript中改变闭包中的this关键字中经常用到的就是call和apply了

首先:call和apply的作用的区别是什么?

答:call和apply 的作用是相同的。都是用来改变函数this值以及对函数传递相应的参数。区别是他们传值不同,call是一个一个的参数进行传值,即以散列的方式传值;而apply则是把所有的参数放到一个数组中,只传这个数组就足够了。。

应用:在js中我们经常会用到数组的一些方法。但是类数组的形式却不能直接用数组的方法。那么我们就可以利用call和apply方法来间接的使用数组Array的方法

enter code here                                                                                  
var ary=[{name:"gudaochuan",age:22},{name:"super",age:48},{name:"man",age:38}];
console.log([].sort.call(ary,function(a,b){return a.age-b.age;}));

以下是上面数组输出的结果:enter image description here

下面是一道面试题:据说是以前金山出的,现在应该没有这道题了:

function fn1(){alert(1)};

function fn2(){alert(2)};

fn3=fn2.call; 
fn2.call(fn1);
//请问输出什么结果,为什么

fn3.call(fn1);//请问输出什么结果,为什么

fn2.call(fn1);这个没有什么可说的。fn2里面没有this,所以这里call(fn1)没什么意义。就相当于直接调用fn2()方法,弹出2

主要是下面这个

fn3=fn2.call;

fn3.call(fn1);

fn3=fn2.call是什么意思呢?

*1.*call是定义在原型上的方法。所以说fn2.call只是这个call方法的定义......就和普通的一个方法的定义没有区别。所以fn2.call==fn3==Function.protoType.call

Function.protoType.call是方法原型上的call方法

所以fn3=fn1.call=fn2.call

*2.*fn2.call(null); 这里fn2的this是谁, call里的this是谁

fn2里面的this被强制转换成null了。call里的this就是fn2

*3.*call是function类型的 call是原型的方法所以call是function类型的

所以 call可以调用call方法

fn3.call(fn1)==Function.call.call(fn1);

最后一个注意的地方是:类上的方法this是谁就相当于谁在调用这个方法。所以说

Function.call.call(fn1);

Function.call 它里面的this指向fn1那么就相当于fn1.call

那么fn3.call(fn1); 弹出1

posted on 2014-12-23 13:36  月落无声  阅读(500)  评论(0编辑  收藏  举报