在javascript中硬绑定

Sha*_*ane 3 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); // 
Run Code Online (Sandbox Code Playgroud)

我对这个功能更感兴趣.

var bar = function() {
    foo.call(obj);
};
Run Code Online (Sandbox Code Playgroud)

为什么我们foo.call(obj)在另一个里面function?我们可以直接使用它吗?

setTimeout(foo.call(obj), 100); // still results in 2.
Run Code Online (Sandbox Code Playgroud)

six*_*man 6

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

所以,当你这样做时foo.call(obj),thisin 的值foo将是obj.

至于setTimeout你,你正在做的是立即调用它而不是等待100ms.改变它10000,你会更清楚地看到它不等待.

所以这就是需要这个功能的原因.您需要将函数传递给setTimeout,并在您提供的持续时间后调用它.


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

setTimeout(foo.bind(obj), 100);
Run Code Online (Sandbox Code Playgroud)

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

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