使用a的原因
(0, foo.fn)();
是cut the binding :this
将不再绑定(bind)到foo
,而是绑定(bind)到全局对象。
但是任何 JavaScript 代码(或 Google 的 JS 代码)想要切断绑定(bind)的原因是什么? (这是否是反模式?)
请您参考如下方法:
这种代码通常由转译器(如 Babel)生成,以便将现代 JavaScript(使用最新的规范添加内容)转换为更广泛支持的 JavaScript 版本。
以下是发生此转译模式的示例:
假设我们在转译之前有这个原始代码:
import {myfunc} from "mymodule";
myfunc();
要制作此 ES5 兼容代码,您可以这样做:
"use strict";
var mymodule = require("mymodule");
mymodule.myfunc();
但这里我们将使用 mymodule
作为 this
值来执行 myfunc
,这在原始代码中不会发生。尽管这可能并不总是一个问题,但最好确保该函数的行为就像在原始版本中一样,即使该函数将使用 this
引用——在 myfunc
中使用 this
可能是多么不寻常甚至无用(因为在原始版本中它也会是未定义
)。
例如,如果原始代码由于函数中的 this.memberFun()
引用而引发错误,那么它也会在转译版本中引发错误。
这就是使用逗号运算符来消除这种差异:
(0, mymodule.myfunc)();
当然,在您自己编写的代码中,您永远不会有这种模式的良好用例,因为您首先不会在 myfunc
中使用 this
.