为什么下一个代码不会出现错误?
var bar = 1,
foo = {};
foo: {
bar: 2;
baz: ++bar;
};
返回2
它知道javascript有标签,它有助于管理循环和if语句。
这段代码可以用吗?
我看到带有::
运算符的AngularJS框架提供了一次性绑定。也许你听到另一个使用那个奇怪的算子的例子。
答案 0 :(得分:6)
这不是错误,因为foo
中的foo: {...}
是statement label。它与您的foo
变量无关,它与任何事物都没有任何关系。
同样,{
和}
定义了一个块,而不是一个对象,内部的bar
和baz
也是语句标签。
陈述
2;
和
++bar;
完全有效。第一个看起来有点奇怪,但它有效;在JavaScript中,任何表达式can be used as a statement,包括一个简单的常量。 (这很有用;它是"use strict"
指令中JavaScript的滑动方式。)
结果为2
,因为阻止takes the value of the last statement in the block,即++bar;
。
除非某些内容正在使用这些语句标签,否则该代码等同于:
var bar = 1,
foo = {};
2;
++bar;
这段代码可以用吗?
纯粹是给定的,我不知道如何,不。但是请注意,如果你在foo
块中有一个循环,并且你在循环之后有了一些东西,你可以使用一个定向中断来跳过循环后的东西:
var bar = 1,
foo = {};
foo: {
bar: 2;
baz: ++bar;
for (var n = 0; n < 10; ++n) {
snippet.log("n = " + n);
if (Math.random() < 0.3) {
break foo;
}
}
snippet.log("Probably don't get here");
};
snippet.log("Done");
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
在那里,你不会看到Probably don't get here
,但在Math.random()
连续十次返回小于0.3
的值的边远情况除外。
为了做到这一点,你需要一个循环或switch
; break
is only valid in loops and switch
。这将是非常不寻常的事情......