为什么任何JavaScript代码都想“削减绑定”​​?


10

使用一个的原因

(0, foo.fn)();

削减绑定this不再绑定到foo而是将绑定到全局对象。

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


称它为绑定不对。bind方法绑定。在这里,这只是上下文的更改。您不能削减或失去约束力(由建立的联系bind)。
marzelin

也许这段代码是由编译器从某些函数语言(clojurescript?)生成的,在调用函数时有特定要求?
marzelin

为什么babel会重写对(0,fn)(…)的导入函数调用的可能重复项-还是在其他地方看到呢?
Bergi

我觉得我看到了它在谷歌的代码,并可能在像角一些框架,反应,或者一些其他的......想不起,有时是精缩
nonopolarity

Answers:


8

这种代码通常由编译器(如Babel)生成,以将现代JavaScript(使用该规范的最新功能)转换为更受支持的JavaScript版本。

这是发生这种转嫁方式的一个例子:

假设在转译之前我们有以下原始代码:

import {myfunc} from "mymodule";
myfunc();

要制作与ES5兼容的代码,您可以执行以下操作:

"use strict";    
var mymodule = require("mymodule");    
mymodule.myfunc();

但是这里我们将myfuncmymoduleas this值执行,这在原始代码中没有发生。虽然可能不会永远是一个问题,这是更好地确保函数的行为就像它会在原来的版本,即使该函数将使用一个this参考-如何不寻常的,甚至是无用的使用thismyfunc可能是(因为在原始版本中也将是undefined)。

因此,例如,如果原始代码由于this.memberFun()函数中的引用而引发错误,那么它也将引发已编译的版本。

这就是使用逗号运算符来消除该差异的原因:

(0, mymodule.myfunc)();

诚然,在代码中,你写你自己,你永远不会有一个良好的用例这种模式,因为你不会使用thismyfunc摆在首位。


如何require与任何ES6或ES5?我曾经以为require是一个节点模块。
connexo

require确实是节点中可用的功能,或者是在诸如browserify,require.js等的库中提供的功能。它与ES5 / 6没有特别关系。另一方面,如果import没有诸如翻译之类的东西,则无法将ES6 +语言构造像backport移植到ES5。
特里科特,

因此,如果将其压缩为一个摘要的几行:如果它是一个库或模块,其中包含很多不是方法或OO的功能(以形式modA.fn1),那么这些功能确实不应该使用,this但是如果偶然他们确实这样做了,我们不希望它this以任何方式影响模块的副作用,因此我们切断了绑定,使其表现为独立功能时的行为
nonopolarity

是的,这确实是您可以总结的方式。同样,对于编译器而言,这主要是一个问题,而不是编码器。
特里科特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.