We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
call、apply、bind三者均来自Function.prototype,被设计用来用于改变函数体内this的指向。
举个 call 的例子:
let foo = { value: 1 }; function bar() { console.log(this.value); } bar.call(foo); // print: 1
在这个例子中,我们注意到 call 改变了 this 的指向,指向 foo ,并且 bar 函数执行了
apply() 方法调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。
func.apply(thisArg, [argsArray])
call() 方法调用一个函数, 其具有一个指定的this值和分别地提供的参数。
在这里只考虑非严格模式下对call和apply的模拟实现,又由于Symbol没有对应的包装对象,在此不考虑Symbol类型作为this的情况
call 和 apply 都是改变了this的指向,让新的对象可以执行该函数。
那么我们的思路就变成给新的对象添加一个函数,然后在执行完以后删除。
实现如下:
Function.prototype.myCall = function(thisArg,...args) { // undefined null 时 thisArg 重置为window // 基本类型时 thisArg 重置为对应的包装对象 if(thisArg === undefined || thisArg === null){ thisArg = window; }else if(typeof thisArg === 'number'){ thisArg = new Number(thisArg); }else if(typeof thisArg === 'string'){ thisArg = new String(thisArg); }else if(typeof thisArg === 'boolean'){ thisArg = new Boolean(thisArg); } //为thisArg设置fn属性,绑定当前函数 thisArg.fn = this; //获取函数调用结果 let result = thisArg.fn(...args); //删除临时增加的属性fn delete thisArg.fn; //返回最终结果 return result; }; Function.prototype.myApply = function(thisArg,args) { return this.myCall(thisArg,...args) };
The text was updated successfully, but these errors were encountered:
No branches or pull requests
模拟实现call和apply
简单介绍一下 call 和 apply
call、apply、bind三者均来自Function.prototype,被设计用来用于改变函数体内this的指向。
举个 call 的例子:
在这个例子中,我们注意到 call 改变了 this 的指向,指向 foo ,并且 bar 函数执行了
call
apply
简单模拟实现
在这里只考虑非严格模式下对call和apply的模拟实现,又由于Symbol没有对应的包装对象,在此不考虑Symbol类型作为this的情况
call 和 apply 都是改变了this的指向,让新的对象可以执行该函数。
那么我们的思路就变成给新的对象添加一个函数,然后在执行完以后删除。
实现如下:
The text was updated successfully, but these errors were encountered: