1.call()与apply()的由来
Function(函数对象)
正如数组对象对应的类型为Array,数字对应的类型为Number,字符串对应的类型为String一样;
定义一个字符串可以这样定义: var str='abc';
也可以这样定义: var str=new String('abc');
定义一个数组可以这样定义: var arr=[1,2,3];
也可以这样定义: var arr=new Array(1,2,3);
对于这两种方式本质上是相同的,因为在js底层构建时都会转化为下面一种方式,而函数亦是如此。
普通函数定义: function add(a,b){return a+b}; 或 var add=function(a,b){return a+b;}
等价于构造一个Function对象: var add=new Function("a","b","return a+b");
或者另一种传参方式 var add=new Function("a,b","return a+b");
new Function(e1,e2,...,body)等价于function(e1,e2,...){body}
而Function中自带了一些方法和属性,比如很有名的arguments,constructor,prototype等属性,以及aplly,call,bind等方法。
2.call方法
调用方式 obj1.fun1.call(obj2,arg1,arg2,...);
var A={
add:function(a,b){ return a+b; }
}
var B={
reduce:function(a,b){ return a-b;}
}
var c=A.add.call(b,1,2); //返回3
理解:其实就是调用了A的add(1,2)方法,但在此基础上add中的this指向的是B
通俗点理解:call的作用就是B调用了个别人的方法,但是用完又还给A了,B是使用者,不是拥有者。
3.apply()
调用方式 obj1.fun1.call(obj2,args);
用途跟call()一模一样,但后面传的参数是个数组。
高级用法:
Math.min.apply(null,arr); //可求出一个数组中的最小值
Array.prototype.push(arr1,arr2); //用push方法实现连接两个数组
Array.prototype.slice(obj); //将伪数组转化为真数组
伪数组:var json={0:'a',1:'b',2:'c',length:3} 类似这种的数组