为什么任何 JavaScript 代码都想“切断绑定”?

nop*_*ole 15 javascript

使用一个的原因

(0, foo.fn)();
Run Code Online (Sandbox Code Playgroud)

切断绑定this将不再foo绑定到全局对象,而是绑定到全局对象。

但是,任何 JavaScript 代码(或 Google 的 JS 代码)都想削减绑定的原因是什么?(它是否是反模式?)

tri*_*cot 13

这种代码通常由转译器(如 Babel)生成,以便将现代 JavaScript(使用规范的最新添加)转换为更广泛支持的 JavaScript 版本。

这是发生这种转译模式的示例:

假设我们在转译之前有这个原始代码:

import {myfunc} from "mymodule";
myfunc();
Run Code Online (Sandbox Code Playgroud)

要使此 ES5 兼容代码,您可以这样做:

"use strict";    
var mymodule = require("mymodule");    
mymodule.myfunc();
Run Code Online (Sandbox Code Playgroud)

但在这里我们将myfunc使用mymoduleasthis值执行,这在原始代码中没有发生。尽管这可能并不总是一个问题,但最好确保该函数的行为与原始版本中的一样,即使该函数将使用this引用——使用thisinmyfunc可能是多么不寻常甚至无用(因为在原始版本中也是如此undefined)。

因此,例如,如果原始代码会因为this.memberFun()函数中的引用而引发错误,那么它也会在转译后的版本中引发错误。

因此,逗号运算符用于消除这种差异:

(0, mymodule.myfunc)();
Run Code Online (Sandbox Code Playgroud)

诚然,在您自己编写的代码中,您永远不会有这种模式的良好用例,因为您首先不会使用thisin myfunc