首页 > 代码库 > 关于call和apply的那点事儿
关于call和apply的那点事儿
在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;}));
以下是上面数组输出的结果:
下面是一道面试题:据说是以前金山出的,现在应该没有这道题了:
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
关于call和apply的那点事儿