# bind
bind() 方法会创建一个新函数。当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,之后的一序列参数将会在传递的实参前传入作为它的参数。
# 示例
function person(age, height) {
console.log(this.name)
console.log(age)
console.log(height)
return {
name: this.name,
age,
height
}
}
var name = 'zhangsan'
var obj = {
name: 'lisi',
}
var b1 = person.bind(null)
var b2 = person.bind(obj, 18)
var b3 = person.bind(obj, 20)
var p1 = b1() // p1 = { age: undefined, height: undefined, name: "zhangsan" }
var p2 = b2(180) // p2 = { age: 18, height: 180, name: "lisi" }
var p3 = new b3(190) // p3 = { age: 20, height: 190, name: undefined }
# 特点
通过以上示例,我们可以看出bind函数的一些特点
- 返回一个函数
- 使用new运算符的时候,绑定的 this 会失效,但传入参数依然生效
- 返回的函数依然可以传入参数
# 模拟实现bind
Function.prototype.myBind = function(context) {
if (typeof this !== 'function') {
throw new TypeError('not funciton')
}
context = context || window
// 获取调用bind的函数,此时就是this
var that = this
// 获取在调用bind时传入的参数
var args = [...arguments].slice(1)
return function F() {
// 拼接参数,此时的arguments代表调用bind返回函数时传入的参数
var allArgs = args.concat([...arguments])
if (this instanceof F) {
// 表示使用了new,则忽略绑定的this值
return new that(...allArgs)
} else {
return that.apply(context, allArgs)
}
}
}
# 参考文章
← 实现call和apply 实现new →