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);//undefinded
10  sayColor.apply(window);//red
11  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都是windown
11 }
12   var applySum2 = function (n1, n2) {
13   that.bbbbb = function () { };
14   return sum.apply(that, [n1, n2]); ///that都是windown
15 }
16   var callSum = function (n1, n2) {
17   that.ccccc = function () { };
18   return sum.call(that, n1, n2); ///that都是windown
19 }
20 alert(applySum1(10, 12)); //22
21 alert(applySum2(10, 13)); //23
22 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]]

原文地址:https://www.cnblogs.com/dean-Wei/p/4031630.html