5



Mozilla ドキュメントに関する ES6 アロー関数のドキュメントを調べているときに、アロー関数は、リンクで説明されているものを除いて、厳密モードのすべてのルールを適用することを知りました。

  var f = () => { 'use strict'; return this};
    var g = function () { 'use strict'; return this;}

    console.log(f()); //prints Window
    console.log(g()); // prints undefined

    //we can test this in firefox!

しかし、Babel.jsアロー関数コードを ES5 コードにトランスパイルして、 (デモ リンク)undefinedではなく返すWindow

"use strict";

setTimeout(function () {
  return undefined;
}, 100);

したがって、上記のスニペットは Babel.js からの出力です。以下の出力ではありませんか?

"use strict";

setTimeout(function () {
  return this;
}.bind(Window), 100);

私が ES6 を書いているなら、Windowそれundefined
はバグですか?
または、私は何かを誤解しましたか?

4

2 に答える 2

6

tl;dr: Babel は、すべてのファイルがモジュールであると想定しています。モジュールはデフォルトで厳密thisであり、その値はundefinedです。


これはBabel FAQでカバーされています:

Babel は、すべての入力コードが ES2015 モジュールであると想定しています。ES2015 モジュールは暗黙的に厳密モードであるため、トップレベルthiswindowブラウザーにもexportsノードにもありません。

この動作を望まない場合は、strict トランスフォーマーを無効にするオプションがあります。

$ babel --blacklist strict script.js

require("babel").transform("code", { blacklist: ["strict"] });

注意: これを行うと、意図的に仕様から逸脱することになり、将来の相互運用の問題が発生する可能性があります。

詳細については、strict トランスフォーマーのドキュメントを参照してください。

于 2015-06-09T04:54:47.320 に答える