自己实现一个bind函数
解释一下,[].slice.call(arguments, 1)是什么意思
Function.prototype.bind = function (obj) {
let that = this /* this对应了调用bind的函数,就比如下面的person */
let args = [].slice.call(arguments, 1) /* 获取调用bind函数时,除第一项外剩余的参数 */
return function (){
that.apply(obj, args.concat(...arguments)) /* 返回的函数依旧可以再次传递参数,将两个参数拼接起来 */
}
} 写一段测试的代码: var person = function (){
console.log(this.name);
console.log(arguments)
}
var obj = {
name: 'Tom'
}
var bindFun = person.bind(obj, '456'); /* 空 什么都不打印 */
bindFun('111');
/*
Tom
[Arguments] { '0': '456', '1': '111' }
*/ 调用原生bind返回的函数,可以当作一个构造函数来new实例化对象,但是我们手写的bind函数,其this指向和原型链都存在问题,与原生bind实现效果存在一定的差异,具体解决方案理解起来比较复杂,可以参考这篇文章:【手写 call、apply,再用 “函数柯里化+寄生组合” 实现 bind】https://blog.csdn.net/qq_44647809/article/details/120784181