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、回调等。