2010-08-15 32 views
1

爲什麼爲什麼我可以'如果(a = 7)...'而不是'if(var a = 7)...'?

if (prev = this.Prev()) { 
    ... 
} 

工作,但

if (var prev = this.Prev()) { 
    ... 
} 

不? this.Prev()是一個Point對象的方法,如果它存在的話返回一個前一個Point的引用;如果它不存在,則返回false。我不想聲明變量是全球性的,而且我不想要的東西一樣冗長:

var prev = this.Prev(); 
if (prev) { 
    ... 
} 

編輯:什麼是最優雅的方式做這樣的事情我想做?

+1

這不是愚蠢的詳細,它是四個字符長。 – 2010-08-15 04:56:24

+0

好的,對不起。 – Nick 2010-08-15 04:59:59

回答

10

這是因爲if statement需要一個表達

語法:

IfStatement : 
    if (Expression) Statement else Statement 

var是,這就是爲什麼你得到一個SyntaxError的聲明。

你的第一個例子,因爲工作的分配是一個表達式(AssignmentExpression

編輯: 讓我引述這一部分:

我不想聲明變量成爲全球

我下站在你的關心,不宣而標識符進行的分配最終會在全局對象上創建一個屬性,而且與ECMAScript 5 Strict Mode,未申報的分配將導致ReferenceError,打破你的代碼中的JavaScript

變量聲明實際的代碼執行前,var聲明中出現的所有綁定到當前變量對象,以及它們與undefined初始化,你不能真正聲明變量條件。

+0

好的,謝謝。你會怎麼說最清潔的方式來處理這個問題?類似this.IfPrev(函數(prev){...})? (我想你已經在過去幾週迴答了我的所有javascript問題)。 – Nick 2010-08-15 04:42:52

+0

我相信我的理解..我在想,如果(var prev = this.Prev()),失敗,那麼你仍然會有一個名爲'prev'的變量在當前函數中保留值'false'範圍。但是由於這個語法是無效的,所以這一點是沒有意義的。 – Nick 2010-08-15 04:58:28

+0

@尼克,國際海事組織你最後一個例子並不壞,你認爲我所認爲的回調方式對於一件簡單的事情來說有點矯枉過正。我會建議你保持簡單;) – CMS 2010-08-15 05:06:44

1

C'est la vie。 JavaScript不允許你在那裏聲明變量。

(這是一個布爾表達式,而不是語句)

0

這是因爲你不能用作表達式充滿關鍵字爲前綴的語句。有些語句,如沒有用關鍵字加前綴的語句,可以很容易地用作表達式,沒有錯誤。

1

你說「我不想聲明變量是全局變量」。但是請記住,JavaScript沒有塊範圍,但只有函數範圍。因此,即使有可能(不是,如@CMS pointed out)那樣,也不允許您更改變量的範圍。

Quoting Douglas Crockford

JavaScript沒有塊範圍,所以定義變量塊可以混淆誰是有經驗的其他C系列語言的程序員。定義函數頂部的所有變量。

+0

哦,不,我的意思在我的第一個例子中,通過省略'var'它會創建變量作爲窗口的屬性,這不是預期的結果。 – Nick 2010-08-15 04:51:23

+0

@尼克:是的,你是對的......但最後一個例子有什麼問題?爲什麼這太冗長? – 2010-08-15 04:53:01

+0

呃,我猜這不算太壞。我想我已經習慣了其他編程語言的語法,起初看起來很難看。 – Nick 2010-08-15 04:54:46

相關問題