2017-06-05 6 views
1

を動作するようには思えdoes notの私のコードです:時間的デッドゾーン(ES6)は、以下

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 

</head> 
<body> 
<h1 id="message"></h1> 

<script src="traceur/traceur.js"></script> 
<script src="traceur/BrowserSystem.js"></script> 
<script src="traceur/bootstrap.js"></script> 
<script type="module"> 

    var x = 'outer scope'; 
    (function() { 
     console.log(x); //Expected undefined, got undefined ! this is as expected. 
     var x = 'inner scope'; 
    }()); 

    //same as above, but changed to var to let and x to y 
    let y = 'outer scope'; 
    (function() { 
     console.log(y); //Was expecting ReferenceError here, but got undefined. WTF ??!!! 
     let y = 'inner scope'; 
    }()); 


</script> 

</body> 
</html> 

そのましょう-VARは、その前に使用した場合にはES6の時間ドロップゾーン(TDZ)はにReferenceErrorをスローする必要がありそうです宣言されています。

ただし、この例ではletに対して未定義となっています。 どこが間違っていますか?

この問題は長い間続いており、この日は無駄になりました。 (すべてのポインタは非常に助けになるだろう)。私はChrome v58を使用しています。

v58には現在のブラウザの下でhttps://kangax.github.io/compat-table/es6/のようにes6互換性があります)。

私は痕跡部分を剥ぎ取り、バベルに掲示して試してみて、同じ結果を得ました。 enter image description here

なぜ私のクロームv58で動作していないのだろうか。たぶんそれは他の何かを必要とするでしょうか?

+0

FYI、これは時間的**死んだ**ゾーン*、一時的な*ドロップ*ゾーンと呼ばれています。 –

答えて

0

Traceurを使用しています(does not support TDZ for let/const)。 letvarに変換します - あなたのvarの例と同じようにletのTDZ動作を行います。 ES6互換環境で同じコードを実行し、あなたが期待される結果表示されます:

var x = 'outer scope'; 
 
(function() { 
 
    console.log(x); 
 
    var x = 'inner scope'; 
 
}()); 
 

 
let y = 'outer scope'; 
 
(function() { 
 
    console.log(y); 
 
    let y = 'inner scope'; 
 
}());

+0

どのブラウザとそのバージョンを使用していますか?私はChrome v 58を評価し、kangax.github.io/compat-table/es6(現在のブラウザの下)を使用していて、ES6と互換性があるように見えます。 – Plankton

+0

クロム58もあります。上の* Run code snippet *ボタンをクリックしましたか?正しい結果を – CodingIntrigue

+0

以下に示す必要があります。はい、私はそれを見ました。私のChromeブラウザではうまくいかない理由が不思議ですv 58.それを試してみてください。私は同じ結果を得ています。未定義。これは間違っています – Plankton

0

を私はtranspilerコードを削除し、JS クロムで実験的機能が有効://フラグを/#enable-javascript-harmonyここで期待通りに機能しました。

クロムバージョンv58