2016-07-21 9 views
6

ES6コード:Babel.jsでコンパイルした後、ES6コードとES5コードの結果が異なるのはなぜですか?

let foo = 'outer'; 

function bar(func = x => foo){ 
    let foo = 'inner'; 
    console.log(func()); 
} 
bar(); // outer 

結果が "外" です。

Babel.jsでコンパイルES5コード:

'use strict'; 

var foo = 'outer'; 

function bar() { 
    var func = arguments.length <= 0 || arguments[0] === undefined ? function (x) { 
     return foo; 
    } : arguments[0]; 

    var foo = 'inner'; 
    console.log(func()); 
} 
bar(); // inner 

結果が "外" です。

私はなぜ彼らが異なる結果を持っているのかわかりません。

答えて

5

これはbug in Babelです。複雑なパラメータリストの式は、関数本体の宣言を見ることができないはずですが、ここでBabelによって生成されたコードは、関数のスコープ内でデフォルトのパラメータを評価します。内部はfooです。

+0

問題が既に作成されているか、作成することができますか?いずれの場合も、あなたがあなたの答えを1つのリンクで更新した場合に役立ちます。 – zerkms

+2

リンクを追加しました。興味深いことに、このバグのコードはこの質問に正確にあるので、私はこの質問のポイントを逃したのではないかと心配しています。 – Bakkot

関連する問題