首页 > 代码库 > js中的call()与apply()

js中的call()与apply()

js中的call()函数和apply()函数:

1、主要作用:是用于指定作用域和传参

(1)用于指定作用域 

 1  window.color = "red"; 2  var o = { color: "blue" }; 3  var sayColor = function () { 4  debugger; 5  alert(this.color); 6   } 7  sayColor(); 8  9  sayColor.apply(this);//undefinded10  sayColor.apply(window);//red11  sayColor.apply(o);//blue

(2)用于传参

 1   that = this; 2   var sum = function (n1, n2) { 3   debugger; 4   this.n1 = n1; 5   this.n2 = n2; 6   return this.n1 + this.n2; 7 } 8   var applySum1 = function (n1, n2) { 9   that.aaaaa = function () { };10   return sum.apply(that, arguments); ///that都是windown11 }12   var applySum2 = function (n1, n2) {13   that.bbbbb = function () { };14   return sum.apply(that, [n1, n2]); ///that都是windown15 }16   var callSum = function (n1, n2) {17   that.ccccc = function () { };18   return sum.call(that, n1, n2); ///that都是windown19 }20 alert(applySum1(10, 12)); //2221 alert(applySum2(10, 13)); //2322 alert(callSum(14, 10)); //24    

2、apply()与call()解析

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

 Function.apply(obj,args)方法能接收两个参数
obj:这个对象将代替Function类里this对象
args:这个是数组,它将作为参数传给Function(args-->arguments)

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

  Function.call(obj,n1,n1,...);

3、apply()巧用

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

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

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

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

1  var arg = [5, 2, 1, 6, 8];2  var max = Math.max.apply(null, arg);3  var min = Math.min.apply(null, arg);4  alert("max:" + max + "---min:" + min);

结果:max:8---min:1

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

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

(3)可以将两个数组合并

1  var ar1 = [1, 2, 5];2  var ar2 = [5, 7, 9];3  ar1.push.apply(ar1, ar2);//ar1=[1,2,5,5,7,9]

而ar1.push(ar2);//结果ar1=[1,2,5,[5,7,9]]

 

js中的call()与apply()