- 了解call,apply和bind对于看一些源码以及封装一些工具有很大的作用。
- 如果想要了解并熟练使用它。。就必须知道他的基本的实现原理。
一,基本用法
- 使用
let obj = {
a: 18
}
function fn(a) {
console.log(a);
}
fn.call(obj, '传call');
fn.apply(obj, ['传apply']);
fn.bind(obj)('传bind')
复制代码
- 作用:主要是用call,apply和bind改变this的指向。
二,模拟实现
- call
Function.prototype.myCall = function(context, ...args) {
let fn = this;
let context = context || window;
context.fn(...args);
delete context.fn;
}
复制代码
- apply
Function.prototype.myApply = function(context, ...args) {
let fn = this;
let context = context || window;
context.fn(args);
delete context.fn;
}
复制代码
- bind
Function.prototype.myBind = function(context, ...out) {
if(typeof this !== 'function') {
throw new Error('error');
return;
}
let fn = this;
let context = context || window;
let oldFn = function(){};
let newFn = function(...inner) {
return fn.apply(context, [...out, ...inner]);
};
newFn.prototype = fn.prototype ? fn.prototype : oldFn.prototype;
newFn.prototype.constructor = newFn;
return newFn;
}
复制代码
三,call和apply还有个作用。判断变量类型
- Object.prototype.toString.call(1) // "[object Number]"
- Object.prototype.toString.call(false) // "[object Boolean]"
- Object.prototype.toString.call('aaa') // "[object String]"
- Object.prototype.toString.call(function(){}) // "[object Function]"
function checkType(aa) {
let type = Object.prototype.toString.call(function(){})
return type.slice(8, -1);
}
复制代码