自己实现一个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