2016-05-12 10 views
1

私はES6とTypeScriptの両方がブロックレベルスコープをサポートしていることを理解していますが、ES3とES5をターゲットにするときは、出力は機能レベルのスコープにする必要があります。私は、なぜTypeScriptが変数を吊り上げていないのかという背後にある論理がなければならないと思います。問題にぶつかってはいません。なぜ、変数を持たないのか不思議です。なぜ型コピートランスは変数を持ち上げないのですか?

function seed(length: number, multiplier: number): number[] { 
    let result: number[] = []; 

    for(let i: number = 0; i < length; i++) { 
    let n: number = i * multiplier; 

    result.push(n); 
    } 

    return result; 
} 

transpiler出力:

function seed(length, multiplier) { 
    var result = []; 
    for (var i = 0; i < length; i++) { 
    var n = i * multiplier; 
    result.push(n); 
    } 
    return result; 
} 

Iは、関数の先頭に掲げ変数宣言を有するものであろうと予想しているであろう結果、次の活字体所与例えば

、 。このようなもの:

function seed(length, multiplier) { 
    var 
    i, n, 
    result = []; 

    for (i = 0; i < length; i++) { 
    n = i * multiplier; 
    result.push(n); 
    } 
    return result; 
} 

洞察力は大変ありがとうございます。ありがとう!

答えて

3

これは、コンパイラがコーディング標準に基づいてコードを出力しないためです。それは元の入力に可能な限り近づきます。

var変数はとにかく(var hoisting)シーンの後ろに吊り下げられることに注意してください。この場合、TypeScriptコンパイラが入力を変更する必要はなく、不必要にその複雑さを増やすことになります。

1

なぜTypeScriptが変数を持ち上げていないのかの背後にある論理があると思います。私は問題に遭遇していません。変数がない理由はもっと興味があります。

まさにそれです。それは問題ではないので、なぜ吊り上げの努力をするのでしょうか?

また、letの場合実際にはあなたが示したようにホイストするのは間違いでしょう。 var変数のような宣言がされる前に

時間的なデッド・ゾーン

まずlet変数を使用することはできません。 varを使用するとundefinedになります。 letでは、一時的なデッドゾーンのためReferenceErrorになります。あなたは、実行時にそれに実行されませんので、幸いな活字体はとにかくあなたのコンパイル時のエラーを与える:

console.log(a); // Error: Block scoped variable used before declaration 
let a = 123; 

ブロックスコープ

for で宣言さ

let変数がためのループでのみ使用可能です。これは、ブロックスコープであり、ではなく、です。More on this

あなたはlet(代わりに、実行時にそれに実行しているのを)誤用した場合に再び活字体はあなたにコンパイル時のエラーを与える:

for(let i: number = 0; i < 10; i++) {  
} 
console.log(i); // Error: no variable i in scope 

希望ES3/5使用LETため

+0

しかし、出力を支援、varではなくそれで、宣言を上に移動することができます。しかし、すでに正確性をチェックされている自動生成されたコードでこれを行うことはあまり意味がありません。 –

+0

Durrr、それはvarを使用することを意味します。 –

関連する問題