call、apply、bind的区别和实现
这三个方法都是用来改变函数中this指向的。其中call和apply作用完全一样
- apply
apply
接受两个参数,第一个参数指定了函数体内 this 对象的指向,第二个参数为一个带下标的集合,这个集合可以为数组,也可以为类数组。
类数组:
1、对象本身可以存取属性
2、对象的length属性课读写 - call
call
接受多个参数,第一个参数指定了函数体内this对象的指向,从第二个参数开始的参数依次传入函数体内 - bind
bind
的参数与call
一致,但是bind
不会调用函数,而是返回一个新的函数
手写apply、call、bind
Function.prototype.apply = function (context) {
var context = context || window;
var args = arguments[1] || [];
context.fn = this;
var result = context.fn(...args);
delete context.fn;
return result;
}
Function.prototype.call = function( context ){
var argus = [];
for (var i = 1; i < arguments.length; i++) {
argus.push(arguments[i]);
}
this.apply(context, argus);
};
Function.prototype.bind = function( context ){
var self = this; // 保存原函数
// 返回一个新的函数
return function(){
// 执行新的函数的时候,会把之前传入的 context // 当作新函数体内的 this
return self.apply( context, arguments );
}
};