如何用apply实现一个bind?
bind方法与call/apply最大的区别就是bind返回一个绑定上下文的函数,而call/apply是直接执行了函数,特性如下:
Function.prototype._bind = function(target) {
// 保留调用_bind方法的对象
let _this = this;
// 接收保存传入_bind方法中的参数,等价于arguments.slice(1),除了第一个参数其余全视作传入参数
let args = [].slice.call(arguments, 1)
return function() {
return _this.apply(target, args)
}
}
let obj = {
name: '测试员小陈'
}
// 测试函数
function test(args) {
console.log('this:', this);
console.log('我的名字:', this.name);
console.log('我接收的参数:', args);
}
console.log(test._bind(obj, "I am args")); // output: [Function]
test._bind(obj, "I am args")()
/* 执行结果
* this: { name: '测试员小陈' }
* 我的名字: 测试员小陈
* 我接收的参数: I am args
*/
在处理类数组中,发现了两种将数组方法应用于类数组的方法,现将call/apply的常用方式总结一下。当做函数调用;作为对象的方法,给第三方使用;作为原型的方法,给第三方使用
首先看call和apply,第一个参数就是改变的this指向,写谁就是谁,如果是非严格模式下,传递null或undefined指向的也是window,二者唯一的区别是执行函数时,传递的参数方式不同,call是一个个的传递
相信很多朋友都会被问到过这样的一个JS问题,如何实现call | apply | bind,很多朋友只会用但是不会写,或者是死记硬背写法,等到面试官提问的时候,支支吾吾讲不清楚,今天我将教会大家完全理解这个破题!
call 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数,上述例子中,当foo函数单独调用时内部this绑定为全局对象window。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!