我正在创建一个库,我经常检查Closure Compiler输出的结果,看看它是如何做的(我确实有单元测试,但我仍然希望看到编译后的代码,以了解它如何更好地压缩)。
所以,我发现了这段非常奇怪的代码,这是我以前从未见过的。
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
提供带有您可以使用a引用的标识符的语句 打破或继续声明。
例如,您可以使用标签来标识循环,然后使用 打破或继续声明以指示程序是否应该 中断循环或继续执行。
你看到的另一个常见的地方是当人们在事件处理程序上粘贴精彩且无用的javascript:
时。
答案 1 :(得分:2)
这是一个label(以冒号结尾的位)后跟一个块(由大括号括起来的代码)。
块通常遵循控制语句,例如if(...) { /*block*/ }
,但它们也可以单独使用,就像您的示例一样。
标签允许使用continue
或break
一次跳转多个循环;有关几个示例,请参阅链接的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:
是内部循环内部代码可以跳转到的标签,以便转义到外部循环。
答案 2 :(得分: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
答案 3 :(得分:-1)
这只是一个label
。
您可以在循环中使用continue [label name]
(或break
)转到标签。
在整个互联网中可以看到更多关于它们的解释。
答案 4 :(得分:-1)
它用于在javascript中标记语句。更多详细信息here。
标签声明可以在break
和continue
之后使用。