javascript的bind
bind主要是为了改变函数内部的this指向,这个是在ECMA5以后加入的,所以IE8一下的浏览器不支持
bind方法会创建一个新函数,称为绑定函数.当调用这个绑定函数时,绑定函数会以创建它时传入bind方法的第一个参数作为this,传入bind方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数.
可以看这段实例:
var logger = {x: 0,
updateCount: function(){
this.x++
console.log(this.x)
}
}
// 下面两段代码的实现是一样的
document.querySelector('button').addEventListener('click', function(){
logger.updateCount()
})
//用这种方式让代码更简洁,当然这只是bind的一种场景
document.querySelector('button').addEventListener('click', logger.updateCount.bind(logger))
先看一个 bind 函数的例子:
如果我们要手写一个 bind 函数的话,我们需要知道 bind 拿了什么参数,干了什么:①接收一个对象(this);②接受n个参数;③返回函数。
那么需求我们知道了,如何实现呢?
首先 fn1 对于 Function 来说是 Function 的实例,这个没有问题吧。那么肯定有 fn1.__proto__ === Function.prototype 。 Function.prototype 中是有 call 、 apply 等函数的API,既然这样我们就用我们原型 Function 的方法~
我们不确定bind的参数传几个,我们所知道的只是第一个参数是 this 要指的对象,第二个一直到最后一个参数我们都不确定,所以我们在手写的时候没法一个一个接收参数,所以第一步我们要将第一个参数 this 对象和后面的参数分离。
下面是步骤:
其中, slice 是 Array.prototype 上的方法,这块可以理解为将 arguments 这个类数组赋予数组的 slice 功能。
用 shift 方法将数组的第一项从数组中剔除,改变了原数组,返回了被剔除的这个数组~ 好,这下第一个参数有啦
为了方便,好看,把 this 赋值给变量 self 。这块的 this 就是指:谁调用的这个 bind1 ,就指向谁,比如一开始咱们的例子,如果 fn1 执行的话,就指向 fn1 。
结果我们是要输出绑定过的 this 函数,所以我们这里用 apply 方法,将之前获取的第一个this对象参数 t ,和后面的n个参数 args 传递进去,就是我们想要的结果啦。
检验一下:
bind函数需要再次调用