bind函数

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

传参

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

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
上次更新: 7/30/2021, 6:31:41 PM