2016-05-12 30 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; 
} 

結果我本來期望將是一個與提升到函數的頂部的變量聲明。看起來像這樣:

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的情況下,按照您展示的方式提升它實際上是錯誤的。

時空死區

首先let變量不能使用前聲明像var變量可能。隨着var你會得到undefined。有了let,您將得到一個ReferenceError,由於暫時死區。幸運的打字稿會給你一個編譯時錯誤反正這樣你就不會在運行時遇到的是:

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

塊作用域在for宣佈

let變量僅適用在for循環。這是因爲他們是區塊範圍而不是功能範圍More on this

再次打字稿會給你一個編譯時錯誤,如果你濫用let(而不是你運行到它在運行時):

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

希望幫助

+0

但輸出ES3/5使用的讓利,而不是var。所以它可以將聲明移到頂端。但是在自動生成的代碼中這樣做並不重要,因爲它已經被檢查過正確性。 –

+0

Durrr,我的意思是它使用var,不讓... –