您的位置:首页 > 移动开发

JS中的Call和Apply

2015-10-25 19:36 253 查看
很经常看到这两个函数,Call和Apply,

那这两个方法到底有什么其妙的地方呢?

首先,我们简单的这样看:

call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向。

他的第一个参数是this,第二个是Function的参数。比如你的方法里写了this,普通调用这个方法这个this可能是window。而如果你用了call,第一个参数写啥,里面的this就是啥

function cat() {}
cat.prototype = {
    food: "fish",
    say: function() {
        alert("I love " + this.food);
    }
}
var blackCat = new cat;
blackCat.say();


可以看成是为了实现JS中的重载
function fun1() {
this.add = function() {
return this.a
}

}

function fun2() {
this.sub = function() {
return this.a - this.b
}

}

function fun3() {
this.a = 10;
this.b = 2;
fun1.call(this);
fun2.call(this);
}

var f3 = new fun3()
alert(f3.add());
alert(f3.sub()); //如此,想要继承谁就可以继承谁


apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性.

Function.apply(obj,args)方法能接收两个参数

obj:这个对象将代替Function类里this对象

args:这个是数组,它将作为参数传给Function(args-->arguments)

call:和apply的意思一样,只不过是参数列表不一样.

Function.call(obj,[param1[,param2[,…[,paramN]]]])

obj:这个对象将代替Function类里this对象

params:这个是一个参数列表

a) Math.max 可以实现得到数组中最大的一项

因为Math.max 参数里面不支持Math.max([param1,param2]) 也就是数组

但是它支持Math.max(param1,param2,param3…),所以可以根据刚才apply的那个特点来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项(apply会将一个数组装换为一个参数接一个参数的传递给方法)

这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去

b) Math.min 可以实现得到数组中最小的一项

同样和 max是一个思想 var min=Math.min.apply(null,array);

c) Array.prototype.push 可以实现两个数组合并

同样push方法没有提供push一个数组,但是它提供了push(param1,param,…paramN) 所以同样也可以通过apply来装换一下这个数组,即:

[javascript] view
plaincopy





vararr1=new Array("1","2","3");

vararr2=new Array("4","5","6");

Array.prototype.push.apply(arr1,arr2);

也可以这样理解,arr1调用了push方法,参数是通过apply将数组装换为参数列表的集合.

通常在什么情况下,可以使用apply类似Math.min等之类的特殊用法:

一般在目标函数只需要n个参数列表,而不接收一个数组的形式([param1[,param2[,…[,paramN]]]]),可以通过apply的方式巧妙地解决这个问题!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: