任何人都可以解释我如何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)
在.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()在第一个参数之后传递的所有参数将永久绑定到返回的函数,以便传递给该函数的任何参数将放在绑定的参数之后.