call和apply
标签(空格分隔): javascript
1.call和apply的区别
call和apply的作用一模一样,区别仅在于传入的参数形式不同。
apply 接受两个参数,第一个参数指定了函数体内this对象的指向,第二个参数为一个带下标的集合,这个集合可以是数组,也可以是类数组,apply方法把这个集合中的元素作为参数传递给被调用的函数:
var func = function(a,b,c){
console.log(a,b,c);
}
func.apply(null,[1,2,3]);
//[1,2,3]
call 传入的参数数量不固定,跟apply相同的是,第一个参数也是代表函数体内的this指向,从第二个参数开始往后,每个参数被一次传入函数:
var func = function(a,b,c){
console.log(a,b,c); //[1,2,3]
}
func.call(null,1,2,3);
call是包装在apply上面的一颗语法糖,如果我们明确地知道函数接受多少个参数,而且想一目了然地表达形参和实参的对应关系,也可以用call来传递参数。
当使用call或者apply的时候,如果传入的第一个参数为null,函数体内的this会指向默认的宿主对象,在浏览器中就是window,但是在严格模式下,函数体内的this还是null。
2.call和apply的用途
1.改变this的指向
call和apply最常见的用途是改变函数内部的this指向。
Example
var obj1 = {
name: 'Jack'
};
var obj2 = {
name: 'Roc'
};
window.name = 'name';
var getName = function(){
console.log(this.name);
}
getName(); //name
getName.call(obj1); //Jack
getName.call(obj2); //Roc
2.Function.prototype.bind
Function.prototype.bind 用来指定函数内部的this指向,可以用apply来模拟实现
Example
Function.prototype.bind = function(context){
var self = this; //保存原函数
return function(){ //返回新函数
return self.apply(context,arguments); //执行新的函数的时候,会把之前传入的context当做新函数体内的this
}
};
var obj = {
name: 'Jack'
};
var func = function(){
console.log(this.name);
}.bind(obj);
func();
3.借用其他对象的方法
- 借用构造函数,通过这种技术,可以实现一些类似继承的效果
Example
var A = function(name){
this.name = name;
}
var B = function(){
A.apply(this,arguments);
}
B.prototype.getName = function(){
return this.name;
}
var b = new B('Jack');
console.log(b.getName); //Jack
- 借用数组方法
Example
(function(){
Array.prototype.push.call(arguments,3);
console.log(arguments); //[1,2,3]
})(1,2);