javascript中的硬绑定

javascript中的硬绑定,javascript,Javascript,有人能解释一下硬绑定在javascript中是如何工作的吗 function foo() { console.log(this.a); } var obj = { a: 2 }; var bar = function() { foo.call(obj); }; bar(); // 2 setTimeout(bar, 100); // 我对这个函数更感兴趣 var bar = function() { foo.call(obj); }; 为什么要将foo.ca

有人能解释一下
硬绑定在javascript中是如何工作的吗

function foo() {
    console.log(this.a);
}
var obj = {
    a: 2
};
var bar = function() {
    foo.call(obj);
};
bar(); // 2
setTimeout(bar, 100); // 
我对这个函数更感兴趣

var bar = function() {
    foo.call(obj);
};
为什么要将
foo.call(obj)
包装在另一个
函数中?。我们可以直接使用它,对吗

setTimeout(foo.call(obj), 100); // still results in 2.
.call
(和
.apply
)方法只允许您在被调用的函数中手动设置
this
的值

因此,当您执行
foo.call(obj)
时,
foo
中的
this
的值将是
obj

至于
设置超时
,您要做的是立即调用它,而不是等待100ms。将其更改为
10000
,您将更清楚地看到它不会等待

这就是为什么需要这个函数。您需要将函数传递给
setTimeout
,它将在您提供的持续时间后被调用


还有
.bind()
方法,该方法创建一个新函数,其
值永久绑定到您提供的第一个参数。因此,这实际上是一个有约束力的例子

setTimeout(foo.bind(obj), 100);
因此,在该示例中,将返回一个函数,该函数将始终将
obj
设置为该值。因此,现在正在向
setTimeout
传递一个函数,它将在给定的持续时间后被调用


还可以将参数绑定到函数。在第一个参数之后传递到
.bind()
的所有参数将永久绑定到返回的函数,以便传递到该函数的任何参数都将放置在绑定参数之后。

实现硬绑定不需要setTimeout

function foo() {
    console.log(this.bar);
}

var obj1 = {bar:10};
var obj2 = {bar:5};
var originalFoo = foo;
OriginalFoo现在引用了foo

现在重写foo函数并使用originalFoo.call将this上下文设置为始终为obj1的上下文

foo = function() {
    originalFoo.call(obj1);
}

foo(); // returns 10
foo.call(obj2); //returns 10 even when obj2 passed as arg

绑定的作用与call/apply相同,但它返回一个新函数。此函数可用于传入接受fn作为参数的情况,如seTimeout、回调等。