2012-10-03 47 views
2

這是一個非常人爲的例子,但讓我們假設我們在類函數的某個地方創建了一個變量_this應該創建一個名爲_this的變量與此衝突嗎?

class Person { 
    constructor (public name : string) {} 
    changeName(name) { 
    var _this = {}; 
    (() => { 
     this.name = name; 
    })(); 
    } 
} 

當我們調用changeName函數,因爲編譯代碼的相關部分看起來像這樣按預期這將無法正常工作:

var _this = this; 
var _this = {}; 
(function() { 
    _this.name = name; 
})(); 

這是不好的Javascript:我們有兩個var聲明覆蓋各其他。由編譯器創建的_this正被我的_this覆蓋。

據我所見,這種行爲沒有在TypeScript規範中指定。

他們爲什麼要衝突?編譯器無法檢測到我是否創建了一個名爲_this的變量,並將自動生成的變量命名爲_this2,以使我的變量和編譯器生成的變量不會相互踩踏?

+2

這對我來說似乎是一個非常嚴重的問題。它應該至少包含在語言規範中。我建議在[TypeScript問題跟蹤器](http://typescript.codeplex.com/workitem/list/basic)上發佈這個官方回覆。 – joshuapoehls

回答

7

編譯器將自動創建_this作爲對this的引用,以便於使用lambda語法創建閉包。我很肯定我在TypeScript規範的某處讀到了這個,但我同意在這種情況下編譯器應該發出一個錯誤。

我不喜歡編譯器改變它如何發出JavaScript的想法,因爲這與生成「慣用」(因此可預測的)javascript的既定目標相沖突。

0

難道你不會調用保留變量嗎?我猜你不會聲明一個名爲「this」或「document」的變量。

只要MS清楚保留變量是什麼,我不認爲有一個主要問題。他們或許可以改進編譯器來輸出警告。

+1

據我所知,它沒有記錄爲保留變量。它不輸出任何警告或錯誤。 –

+0

同樣,JavaScript中沒有任何東西不讓你聲明一個名爲'document'的變量。但是,在瀏覽器環境中,「document」將作爲主變量存在,您將無法重新分配它。 –