12

我正在制作一个库,我经常检查 Closure Compiler 的输出结果以了解它是如何做事的(我确实有单元测试,但我仍然希望看到编译后的代码以了解它如何更好地压缩的提示)。

所以,我发现了这段非常奇怪的代码,这是我以前从未见过的。

variable : {
    some();
    code()
}

注意:这不是对象字面量!此外,没有?任何地方可以使它成为?:有条件的.
该代码位于常规功能块IIFE)中。

variable,在这种情况下,是一个未定义的变量。没有代码使它成为 true 、 false 或任何东西,只是为了确保我把 aconsole.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

拜托,如果有人可以向我解释这段代码的用途,或者至少是它的作用,我会很高兴。

4

5 回答 5

8

这是一个标签

提供带有标识符的语句,您可以使用 break 或 continue 语句引用该标识符。

例如,您可以使用标签来标识循环,然后使用 break 或 continue 语句来指示程序是应该中断循环还是继续执行。

你看到的另一个常见的地方是当人们把美妙而无用的东西javascript:放在事件处理程序上时。

于 2012-12-13T20:42:52.790 回答
2

这是一个标签(以冒号结尾的位),后跟一个(用大括号括起来的代码)。

通常遵循控制语句,例如if(...) { /*block*/ },但它们也可以简单地独立存在,如您的示例所示。

标签continue允许使用or一次跳转多个循环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:是一个标签,内循环内的代码可以跳转到,以便逃到外循环。

于 2012-12-13T20:43:40.743 回答
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

于 2014-06-30T17:44:46.090 回答
-1

That is just a label.

you can use continue [label name] (or break) in a loop to go to a label.

More explanations of what they are can be seen throughout the interwebs.

于 2012-12-13T20:40:16.460 回答
-1

它用于标记 jsvascript 中的语句。在此处查看更多详细信息。

带标签的语句可以breakcontinue以后一起使用。

于 2012-12-13T20:43:11.347 回答