labeled statement

258 阅读2分钟

简述

Javascript中标签(label)是一个标识符。标签可以与变量重名,它是一个独立的语法元素(既不是变量,也不是类型),其作用是标识”标签化语句(labeled statement)”。标签可以声明在语句或者语句块之前,从而使这个语句或者语句块“标签化”。声明方式:

label2:{
   var i = 1, j = 2;
   var k = i + j;
}

用法

首先明确一个原则,在JavaScript中,语句优先

{
 a:1
}

在上面的js代码中执行会得到“1”,这是因为如果一段代码既能够以语句的方式解析(相当于一个执行语句),也能用语法的方式解析,在JS中,会优先按语句来解析。"{}"既可以看成代码块,也可以看成对象,按照上面的写法它会优先按语句解析,所以会得到"1"。

如果在浏览器控制台输入{a:1}会得到"{a:1}",这是错误的,console是经过处理的。如果想得到正确的结果可以去watch中查看。

js中有另外三个字改变执行流程,分别是continue、break、return,其中break和continue可以和标签(label)一起使用

aa : {
    for (var i = 0; i < 10; i++) {
        console.log(i);
        for (var j = 0; j < 5; j++) {
            console.log(j);
            if (j === 2) break aa;
        }
    }
}

console.log('done');

按上面的例子,正常情况下,break的作用只是跳出里面的for循环,外层循环不会跳出,但是由于在开始时用了声明式标签"aa:",所以会跳出整个循环,相当于回到aa:,然后执行下面的console.log('done'),当然,这种写法是完全不提倡的,这里只是用来说明JS中的Label Statement这个特性,千万不要这样写代码

"()"的作用

在中如果使用了"()",会将里面的语句按表达式解析(相当于定义变量),例如在eval中在()与不()会得到不同的结果

var str = '{"name": "liu", "age": 20}';
var obj = eval('(' + str + ')');

console.log(obj); 

我们知道,eval(str)会把接收到的字符串在当前上下文中执行,所以上面的句子是会打印出obj的,如果不加括号:

eval('{"name": "liu", "age": 20}')

这里的执行语句相当于

'{"name": "liu", "age": 20}'

上面的结果会报错,是因为",”表达式要求每一项都必须是表达式,这里不满足要求。所以会报错。

这也是立即执行函数的原理:小括号把函数声明变成了函数表达式,后面再跟一个小括号表示调用。

(function () {
    console.log('IIFE');
})()

总结:

  • 在js中使用labeled statement主要是进行语句标签化。
  • 如果一段代码既能以语句解析,也能按语法解析,会优先按照语句解析。
  • "()"会将里面的语句进行表达式化
  • ","逗号表达式必须满足所有语句都是表达式,或者会报错

参考

segmentfault.com/a/119000001…