在JavaScript中链接'绑定'和'调用'?

2hu*_*2hu 6 javascript chaining

当我读到这个答案时,找到var g = f.call.bind(f);.我第一眼看不到这一点.

那么它有一些直接意义,并有一些适当的使用场景吗?

当你在链接中使用call(or apply)或者bind同时使用时,会发生什么?有一些法律吗?

Ber*_*rgi 4

\n

var g = f.call.bind(f);。我第一眼无法理解这一点。

\n
\n\n

我假设您熟悉.call()和方法?嗯,它将方法绑定到函数。.bind() Functionf.callf

\n\n

请注意,这f.call只是Function.prototype.call,我们将其作为属性访问并不重要,f因为我们不在这里调用它。

\n\n
\n

那么它有什么直接的意义吗?

\n
\n\n

当我们查看 ES6 的等效项时,这一点可能会变得更加明显:

\n\n
(Function.prototype.call).bind(f) // or\n(f.call).bind(f) // is basically\n(...args) => f.call(...args) // or more clear\n(ctx, ...args) => f.call(ctx, ...args)\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

它有一些合适的使用场景吗?

\n
\n\n

好吧,既然你知道它的作用了,是的。它可以采用原型方法并将其转换为以实例作为第一个参数的静态函数。一个例子:

\n\n
function Example(n) { this.name = n; }\nExample.prototype.display = function() { console.log(this.name); }\n\nExample.display = Function.call.bind(Example.prototype.display);\n\nvar e = new Example;\ne.display(); // is the same as\nExample.display(e);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

有没有进一步链接的规律call//applybind法律

\n
\n\n

是的:一如既往,只有链中的最后一个属性实际上被作为方法调用。f.call.bind(\xe2\x80\xa6)在上面的例子中, ,Function.prototype.call.bind(\xe2\x80\xa6)或之间没有区别Function.call.apply.bind.call.bind(\xe2\x80\xa6)- 它总是bind调用call

\n\n

然而,通过将它们作为参数传递给对方,你可以做一些 疯狂的 事情或多或少有用的

\n