bind函数
AprilTong 7/12/2021 Javascript
# bind 函数
bind 方法会创建一个新函数,当这个新函数被调用的时候,bind()的第一个参数将作为它运行时候的 this,之后的一序列参数都会将会在传递的实参前传入作为它的参数。
// bind使用
let obj = {
value: 1,
}
function getValue() {
console.log(this.value)
}
// 返回了一个函数
let bindFn = getValue.bind(obj)
bindFn() // 1
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
传参
let obj = {
value: 1,
}
function getValue(name, age) {
console.log(this.value)
console.log(name)
console.log(age)
}
let bindFn = getValue.bind(obj, 'april')
bindFn(24)
// 1
// april
// 24
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
bind 返回的参数可以当作构造函数使用
# bind 模拟实现
Function.prototype.myBind = function(context) {
let self = this
// 获取myBind函数从第2个参数之后的参数(包含第二个参数)
let args = Array.prototype.slice.call(arguments, 1)
let result_f = function() {
// 此时的arguments是指的myBind函数返回的函数传入的参数
let bindArgs = Array.prototype.slice.call(arguments)
// 当作为构造函数时,this指向实例
// 当作为普通函数时,this指向window,将绑定函数的this指向context
return self.apply(this instanceof result_f ? this : context, args.concat(bindArgs))
}
// 修改返回函数的prototype为绑定函数的prototype
// 下面三行的实现等同于 result_f.prototype = Object.create(this.prototype)
let temp_f = function() {}
temp_f.prototype = this.prototype
result_f.prototype = new temp_f()
return result_f
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18