手写call方法
关键字: call, Function.prototype.call
自己来实现一个call方法。
语法:fn.call([context],[arg1]....);
call干了些啥?
- 绑定this到第一个实参
- 执行函数并返回结果
(function(){
function call(context){
// this => fn当前要操作的函数
// 列如fn.call()
context.$fn = this;
let resutl,args = [];
//处理余下参数
for (let i = 1; i < arguments.length; ++i) {
args.push(arguments[i]);
}
result = context.$fn(...args);
// 用完后就删除
delete context.$fn;
return result;
}
// 扩展到Function原型上去
Function.prototype.mycall = call;
})();
// 00-------------------------测试代码--------------------
let obj = {
name:'OBJ'
}
window.name = "WINDOW"
function fn(){
console.log(this.name);
}
fn(); // => this:window
// 使用自己实现的call=>mycall
fn.mycall(obj) // => this:obj
/**
WINDOW
OBJ
*/
以上实现的缺点:
-
不能接受基本类型的值
-
没有处理不传入第一个参数,或者传入第一个参数为null或者undefined
慢慢来,比较快!基础要牢,根基要稳!向大佬致敬!