2012-12-13 17 views
12

我正在做一個庫,我經常檢查Closure Compiler的輸出結果,看看它是如何做的事情(我有單元測試,但我仍然希望看到編譯代碼提示如何更好地壓縮)。請解釋這在javascript中的冒號使用

所以,我發現了這個非常奇怪的代碼,這是我從未見過的。

variable : { 
    some(); 
    code() 
} 

注:這是不是一個對象字面!此外,沒有?任何地方會使它a ?: conditional
該代碼位於常規功能塊(一個IIFE)。

variable,在這種情況下,是一個未定義的變量。 沒有任何代碼可以使它成真,假或者其他什麼,只是爲了確保我把console.log放在那裏,而且我得到了ReferenceError

請注意,我也在IE8中測試我的代碼,所以這不僅僅是在現代瀏覽器中。它似乎是標準的,簡單的舊javascript。

所以我們來試驗一下吧。發射了Chrome瀏覽器的控制檯,我得到這個:

undeclaredVariable:{console.log('does this get logged?')} // yes it does. 
trueValue:{console.log('what about this?')}    // same thing. 
falseValue:{console.log('and this?')}      // same thing. 

但後來......

(true):{console.log('does this work too?')} // SyntaxError: Unexpected token : 

......還有......

so?{console.log('is this a conditional?')}:{alert(123)} // Unexpected token . 

那麼它有什麼作用?

thisThing:{console.log('is used to declare a variable?')} 
thisThing // ReferenceError: thisThing is not defined 

請問,如果有人能向我解釋這段代碼是做什麼的,或者至少它做了什麼,我很樂意。

+0

爲什麼有人投票關閉它? –

回答

8

這是一個label

提供的聲明與您可以參考使用 break或continue語句的標識符。

例如,您可以使用標籤來標識一個循環,然後使用break或continue語句來指示程序是否應該中斷循環或繼續其執行。

你看到它的另一個常見的地方是,當人們在事件處理程序上粘貼美妙而無用的javascript:時。

+0

嘿,這是有道理的。然而,關於'javascript:'的部分,這是一個URI模式(是的,這是一個非常糟糕的做法,它看起來更像是'javascript:void(0)')。 –

+0

'javascript:'部分源於它在bookmarklets和javascript鏈接中的使用(以及混淆)。 –

+0

@CamiloMartin'javascript:'可以用在bookmarklets(作爲書籤存儲的javascript代碼段)中。 –

-1

這只是一個label

您可以在循環中使用continue [label name](或break)轉至標籤。

在整個interwebs中可以看到更多的解釋。

+1

它不適用於goto! – epascarello

+0

什麼?這是javascript。 –

+0

@epascarello更新。 – Neal

-1

它用於標記jsvascript.check中的語句更多詳細信息here

帶標籤的聲明可以與以後的breakcontinue一起使用。

2

這是一個label(以冒號結尾的位),然後是(由大括號包圍的代碼)。

通常遵循控制語句,像if(...) { /*block*/ },但他們也可以簡單地站在自己的,因爲在你的榜樣。

標籤允許在continuebreak一次跳出幾個循環;查看鏈接MDN頁幾個例子,如:

var itemsPassed = 0; 
var i, j; 

top: 
for (i = 0; i < items.length; i++){ 
    for (j = 0; j < tests.length; j++) 
    if (!tests[j].pass(items[i])) 
     continue top; 
    itemsPassed++; 
} 

這裏,top:是內循環內的代碼可以跳轉到,爲了逃逸到外環的標籤。

+0

誰在他們的正確思想中會使用這樣的標籤?我明白,封閉與他們產生的代碼,但...我很高興我沒有用過它們:) –

+0

@CamiloMartin如果你有嵌套循環,你可能需要它們。另外,如果你有嵌套循環,你可能想要重構。 –

+0

@JanDvorak我發誓它沒有在Closure Compiler做過它的事情之前:)這說明了它的縮小能力的奇蹟...... –

0

爲了任何人不知道JSON是什麼,並且看到冒號可能實際上是一個對象,並試圖弄清楚它是什麼,並且發現這個討論,冒號也被使用在JSON中。有一種將函數嵌入到JSON對象中的做法。對於任何碰巧第一次看到這個的人來說,這可能會令人困惑(就像我這樣)。 (每個人都不是生於JSON和JavaScript的知識)。所以如果你發現自己在這個討論中,並且你認爲每當你在JavaScript中看到冒號時,它就是一個標籤,它可能不是。它可能是標籤之後的冒號,或者它可能是JSON的一部分。事實上,JSON中的冒號顯示爲一個字符串,比標籤更常見。對象形式的JSON將顯示爲[object Object],隱藏所有內容。因此,除非JSON以字符串的形式出現,並且您將對象顯示到控制檯(console.log(object)),否則您將看到的所有內容都是[object Object]。編寫包裝在對象中的JavaScript代碼是很常見的做法。在這種情況下,您將以代碼的形式看到JSON。那時候你會問自己:「這是什麼?那結腸是什麼?」然後你會發現自己在這個討論中,並被告知這是一個標籤,當它真的是JSON的一部分。這個討論的主題是措辭:「請解釋JavaScript中對冒號的這種用法」,然後將「正確答案」標記爲與標籤有關。正確的答案是冒號可以以多種方式使用。所以,如果你不知道JSON是什麼,或者認爲你知道(像我這樣做,但並不真正瞭解),請在這裏閱讀: JSON.org

+1

夠公平的,這可能對初學者有幫助。但是你不認爲你這樣寫道的方式對於這個非常人口化的人來說可能過於沉重嗎?也許只是一個非標籤的例子像'var obj = {prop:123}'可以更簡潔地說明這一點。 –

+0

+1表示您的關注。如果我正在閱讀這篇文章,它的寫法就是我希望得到答案的方式。 –