javascript - javascript 中的硬绑定(bind)

标签 javascript

谁能给我解释一下 hard binding 在 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) 包装在另一个 function 中?我们可以直接使用它吗?

setTimeout(foo.call(obj), 100); // still results in 2.

最佳答案

.call(和.apply)方法让您手动设置 this 的值被调用的函数。

所以当你执行 foo.call(obj) 时,foo 中的 this 的值将是 obj.

至于setTimeout,您正在做的是立即调用它,而不是等待 100 毫秒。将其更改为 10000,您会更清楚地看到它没有等待。

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


还有 .bind() 方法可以创建一个新函数,其 this 值永久绑定(bind)到您提供的第一个参数。所以这实际上是一个硬绑定(bind)示例

setTimeout(foo.bind(obj), 100);

因此在该示例中,返回的函数始终将 obj 设置为 this 值。所以现在 setTimeout 被传递给一个函数,它将在给定的持续时间后被调用。

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

关于javascript - javascript 中的硬绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27335128/

相关文章:

javascript - 如何在 jquery 中创建间隔一小时的时间数组?

javascript - 潜在的异步函数返回一个立即解决的 promise ?

javascript - 使用带有可变参数的警报?

javascript - 如何使用 javascript 取回一个文件夹路径 url

javascript - 如何从复杂对象中获取值(value)

javascript - 使用 MySql 和 Websocket 协议(protocol)在 Perl 中创建一个小时

javascript - 如何使用 sjcl 生成对称 key

javascript - 在 WebGL 中只绘制网格的一部分

javascript - jQuery iframe load() 事件?

javascript - React-Router 如何将链接链接到实际页面