JavaScriptコードが「バインディングをカット」する理由は何ですか?


10

を使用する理由

(0, foo.fn)();

バインド切断することです。これthisはバインドされfooなくなりますが、グローバルオブジェクトにバインドされます。

しかし、JavaScriptコード(またはGoogleのJSコード)がバインディングを切断する理由は何ですか?(そしてそれはアンチパターンですか?)


それをバインディングと呼ぶのは正しくありません。bindメソッドがバインドします。ここでは、単なるコンテキストの変更です。結合(によって作成された結合bind)を切断または失うことはできません。
marzelin

このコードは、関数の呼び出しに関して特定の要件を持ついくつかの関数型言語(clojurescript?)からのトランスパイラーによって生成される可能性がありますか?
marzelin

なぜ重複の可能性がありますなぜbabelはインポートされた関数呼び出しを(0、fn)(…)に書き換えますか?-またはどこでこれを見ていますか?
Bergi、

私はそれをグーグルのコードで、そしておそらくAngular、React、または他のいくつかのフレームワークで見たと思います...どこで、時にはそれが縮小されているか思い出せません
非極性

回答:


8

この種のコードは、最新のJavaScriptを仕様に追加した最新のJavaScriptを、より広くサポートされているJavaScriptバージョンに変換するために、通常、トランスベーラー(Babelなど)によって生成されます。

以下は、この変換パターンが発生する例です。

トランスパイレーションの前にこの元のコードがあるとしましょう:

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

このES5互換コードを作成するには、次のようにします。

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

しかし、ここではas 値で実行myfuncしますが、これは元のコードでは発生しません。それかもしれないが、常に問題にならないが、それは確かに機能振る舞いにするために優れているだけで、それ等は元のバージョンになり、その関数が使用する場合でも、どのように変わったかさえも無用の使用ということ-リファレンスでは、(かもしれません元のバージョンでもそうなるからです)。mymodulethisthisthismyfuncundefined

したがって、たとえば、this.memberFun()関数内の参照が原因で元のコードがエラーをスローする場合、変換されたバージョンもスローされます。

つまり、その違いを取り除くためにコンマ演算子が使用されたのです。

(0, mymodule.myfunc)();

当然のことながら、自分で作成したコードthismyfuncは、最初はこのパターンを使用しないため、このパターンの良いユースケースは決してありません。


requireES6またはES5とどのように関連していますか?requireはノードモジュールだと思っていました。
connexo

require確かにnodeで利用可能な関数、またはbrowserify、require.jsなどのライブラリで提供される関数です。ES5 / 6とは特に関係ありません。一方、のようなES6 +言語構成はimport、トランスパイレーションのようなものなしではES5にバックポートできません。
トリンコット

したがって、要約の数行にそれを凝縮する場合:それが実際にはメソッドまたはオブジェクト指向ではない多くの関数を含むライブラリまたはモジュールである場合(の形式modA.fn1)、これらの関数は実際には使用すべきではありませんthisが、偶然の場合彼らはそうします、私たちはthis副作用としてモジュールに何らかの影響を与えたくないので、バインディングをカットし、それが独立した関数である場合の振る舞いを振る舞わせます
非極性

はい、それは確かにそれを要約する方法です。繰り返しますが、これは主にトランスパイラーの問題であり、コーダーの問題ではありません。
トリンコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.