手写代码实现bind功能

bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()中的第一个参数的值,例如:f.bind(obj),实际上可以理解为obj.f(),这时f函数体内的this自然指向的是obj

举例说明:

1
2
3
4
5
6
7
8
9
10
11
var a = {
b: function() {
var func = function() {
console.log(this.c);
}
func();
},
c: 'hello'
}
a.b(); // undefined 这里的this指向的是全局作用域
console.log(a.c); // hello

1
2
3
4
5
6
7
8
9
10
11
12
var a = {
b: function() {
var _this = this; // 通过赋值的方式将this赋值给that
var func = function() {
console.log(_this.c);
}
func();
},
c: 'hello'
}
a.b(); // hello
console.log(a.c); // hello

手写bind

bind有两个特点:

  • 1.本身返回一个新的函数,所以要考虑new的情况
  • 2.可以“保留”参数,内部实现了参数的拼接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Function.prototype.bind2 = function(context){
//传入的必须是函数
if(typeof this != 'function'){
throw new TypeError('Error')
}
const that = this
//保留参数, 以便于之后拼接参数
const args = [...arguments].slice(1);
return function F(){
//如果是被new创建的实例, 那么上下文不会改变
if(this instanceof F){
return new that(...argus, ...arguments)
}
// args.concat(...arguments): 拼接之前和现在的参数
// 注意:arguments是个类Array的Object, 用解构运算符..., 直接拿值拼接
return that.apply(context, args.concat(...arguments))
}
}
//test
function test(arg1, arg2) {
console.log(arg1, arg2)
console.log(this.a, this.b)
}
const test2 = test.bind2({
a: 'a',
b: 'b'
}, 1) // 参数 1
test2(2) // 参数 2
//输出
//1 2
//a b
Snapline wechat
扫码关注我的公众号“约翰柠檬的唱片店”
Buy me a cup of Coffee