前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JS学习系列 07 - 标签声明(Label Statement)

JS学习系列 07 - 标签声明(Label Statement)

作者头像
leocoder
发布于 2018-10-31 03:50:53
发布于 2018-10-31 03:50:53
3K00
代码可运行
举报
文章被收录于专栏:前端进阶之路前端进阶之路
运行总次数:0
代码可运行
1. 引言

假设有这么一道题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (var i = 0; i < 10; i++) {
    console.log(i);
    for (var j = 0; j < 5; j++) {
        console.log(j);
    }
}

console.log('done');
复制代码

我想要当 j = 2 的时候就退出所有的for语句,打印最后的 done ,你会怎么做?

可能有的同学会想到这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function foo () {
    for (var i = 0; i < 10; i++) {
        console.log(i);
        for (var j = 0; j < 5; j++) {
            console.log(j);
            if (j === 2) return;
        }
    }
}

foo();

console.log('done');
复制代码

这样可以实现,但是又多写了一个函数,那么有没有别的办法呢?

再看一个例子,你也一定见到过这样的写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 假设str是你通过ajax接收到的JSON串
var str = '{"name": "liu", "age": 20}';
var obj = eval('(' + str + ')');

console.log(obj); 
复制代码

那么,你有没有想过 eval 里面为什么要加上括号呢?如果不加又是什么情况?(提前剧透,不加括号这里会报错哦)。

接着往下看,当你读完这篇文章的时候,心中的疑惑会完全解开。

2. Label Statement

学过C语言的同学知道,C的语法中有一个语句叫:goto,同时老师也多次强调不让我们使用goto语句,因为会大大影响程序的可读性可维护性

我们先来看一段C语言的goto代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void main(){
    int a=2, b=3;
    
    if(a>b) {
        goto aa;
    }
    
    printf("hello");
    
    aa: printf("s"); 
    
    return 0;
}
复制代码

当 a < b 的时候,这里会打印字符串 "hello",然后结束。 当 a > b 的时候,由于goto语句的作用,就会跳过 print("hello"),直接跳到 aa 标签声明的代码块中,打印字符 "s",然后结束。

这就是goto语句的作用,通过标签声明一个代码块,然后在任何地方都可以执行 goto 'labe' 来进行程序跳转。

显而易见,这样的写法,违背了程序顺序执行的原则,会跳来跳去,最后导致根本无法维护,所以,记住老师的话,不要使用 goto 语句

那么,看完了C语言中的 goto 语句,和我们的 JavaScript 又有什么关系呢? 这就引出了今天的主题:Label Statement,它就是 JS 中的 goto 语句。

3. 用法

首先明确一个原则,在JavaScript中,语句优先。 也就是说,如果一段代码既能够以语句的方式解析,也能用语法的方式解析,在JS中,会优先按语句来解析。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{ a : 1 }
复制代码

上面这段代码,在JS中的执行结果是什么呢? 大家思考2分钟....



好,2分钟已过,大家有结果了吗? 千万不要在浏览器的控制台中去写这段代码,虽然结果和你开始想的结果一样, 但是,它是错误的。

这是在console控制台中执行的结果:

这是在watch中的执行结果:

可以看到两个结果是不一样的。 console是经过处理的这里不能相信,watch是直接JS的运行环境执行后的结果,是正确的。

为什么 { a : 1 } 结果会是 1 呢?

我换一个写法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    a : 1
}
复制代码

相信有的同学已经明白了,在JS中,{}既可以代表代码块,又可以作为Object的语法标志。 那么我们前面说过,JS是语句优先的,当一段代码既可以按照语句解析,又可以按照语法解析的时候,会优先按语句解析。

当把{}当做是代码块的时候,里面的 a : 1,是不是很像C语言goto语句的标签声明呢? 开头我们提出的第一个问题,如果用这种方式来解决,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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');
复制代码

aa是标签声明,包裹一个代码块,break 的作用是跳出当前的循环,本来是无法跳出外面那层for循环的,但是 break aa,这里跳出了整个代码块。

当然,这种写法是完全不提倡的,这里只是用来说明JS中的Label Statement这个特性,大家千万不要这样写代码。

再来看开头提出的第二个问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 假设str是你通过ajax接收到的JSON串
var str = '{"name": "liu", "age": 20}';
var obj = eval('(' + str + ')');

console.log(obj); 
复制代码

我们知道,eval(str)会把接收到的字符串在当前上下文中执行,如果不加括号:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
eval('{"name": "liu", "age": 20}}')
复制代码

这里的执行语句就会变成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "name" : "liu", "age" : 20
}
复制代码

{}按照语句解析,执行里面的逗号表达式,我们知道逗号表达式要求每一项都必须是表达式,输出最后一项的结果,而这里不满足要求,所以会报错。

但是加上括号就变成了这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
({
    "name" : "liu", "age" : 20
})
复制代码

小括号可以把里面的内容当做表达式来解析,那么里面的内容就是一个对象了。

这也是立即执行函数的原理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(function () {
    console.log('IIFE');
})()
复制代码

小括号把函数声明变成了函数表达式,后面再跟一个小括号表示调用。

4. 结束

这里通过几个例子,引出了 JavaScript 的标签声明语句(Label Statement),从而解释了一些我们常用写法的原理。

以后万一有人问你为什么 eval() 解析JSON要加括号呢? 这回知道怎么说了吧。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年04月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
基于Linux搭建开源配置管理中心apollo
Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
星哥玩云
2022/05/28
1.1K0
基于Linux搭建开源配置管理中心apollo
springcloud学习手册-市面主流分布式配置中心框架汇总
导读 | 本节主要是汇总一下,目前市面上主流应用的一些分布式配置中心框架。重点介绍下这4个框架,它们分别是: Apollo(携程 阿波罗) 、Spingcloud Config (springcloud)、Disconf (百度)、Diamod (阿里) 1 Apollo(阿波罗) https://github.com/ctripcorp/apollo Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并
程序源代码
2018/03/09
1.3K0
springcloud学习手册-市面主流分布式配置中心框架汇总
分布式配置中心选型,为什么选择Apollo?
关于配置的常规方案是将配置信息抽离写入 xml、properties文件中,然后随着应用一块打包发布。如果有开发、测试、预发、生产等多套环境,则通过配置各自独立的文件以区分不同的环境。具备一定的扩展性,但每次配置参数变更都要重新发布应用,灵活性较差。
微观技术
2021/04/30
1.3K1
分布式配置中心选型,为什么选择Apollo?
初探Apollo远程服务配置中心
Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
闫同学
2023/10/14
4210
开源 | 携程Apollo配置中心
作者简介 宋顺,携程框架研发部技术专家。2016年初加入携程,主要负责中间件产品的相关研发工作。毕业于复旦大学软件工程系,曾就职于大众点评,担任后台系统技术负责人。 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址…… 对程序配置的期望值也越来越高:配置修改后实时生效,分环境、分集群管理配置,完善的权限、审核机制…… 在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。 Apollo配置中心应运而生! Apollo(阿波罗)是携
携程技术
2018/03/16
1.4K0
开源 | 携程Apollo配置中心
干货 | 携程开源配置中心Apollo的设计与实现
作者简介 宋顺,携程框架研发部技术专家。2016年初加入携程,主要负责中间件产品的相关研发工作。毕业于复旦大学软件工程系,曾就职于大众点评,担任后台系统技术负责人。 1、What is Apollo 1.1 背景 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址…… 对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制…… 在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。 A
携程技术
2018/03/16
3.4K0
干货 | 携程开源配置中心Apollo的设计与实现
Apollo中间件技术:从入门到精通
在Java开发的微服务架构中,配置管理是一个不可或缺的重要环节。随着服务数量的增加和部署环境的复杂化,传统的手动配置管理方式已难以满足需求。Apollo作为一款开源的分布式配置中心,凭借其强大的功能和灵活的架构,成为了众多Java开发者的首选。本文将带你全面了解Apollo中间件技术,从入门到精通,让你轻松掌握Apollo的使用。
小马哥学JAVA
2024/12/28
3580
开源配置中心Apollo + SpringCloud生产环境搭建
本人的linux 已经装好了mysql 并且允许远程配置(linux MySQL与 windows 远程通信连接! )
Java_慈祥
2024/08/06
2230
开源配置中心Apollo + SpringCloud生产环境搭建
分布式配置中心之Apollo实战
微服务架构下,服务的数量视项目的规模大小而定,但数量肯定最少有十几二十个,这些微服务有时候共用一些配置,修改一个配置,这诸多服务都要跟着一起改。任务繁多,而且容易出错。
行百里er
2021/07/14
1.6K0
Apollo 配置中心详解
Apollo 配置中心产生背景 大多情况下程序随着功能的复杂,程序的配置也会增多:包括各种功能的开关、参数的配置、服务器的地址配置等等,同时开发人员对程序配置的期望值也越来越高:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制…… 在这样的大环境下,传统的通过配置文件、数据库等方式已经越来越无法满足开发人员对配置管理的需求。Apollo 配置中心应运而生! Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送
CSDN技术头条
2018/04/18
6.9K0
Apollo 配置中心详解
分布式配置中心apollo是什么?分布式配置中心apollo有什么特点?
随着程序技术的日益提高和程序功能的日益复杂,目前程序的配置也在逐步提高,出现了各种功能的开关和参数配置等,但还需要不断对程序进行更高的配置,这样才能够适应飞速发展的经济和网络技术,也因而出现了分布式配置中心,分布式配置中心作为一种全新的配置,拥有很多全新的功能,下面为大家简单介绍分布式配置中心apollo是什么以及分布式配置中心apollo有什么特点。
用户8715145
2021/10/15
1.8K0
快速学习-Apollo配置中心搭建
Apollo (阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
cwl_java
2020/07/16
3.2K0
微服务架构中配置中心的选择,Apollo值得拥有
目前公司内部微服务架构基础设施建设中,技术选型以Spring Cloud技术为主,也被大家俗称作“全家桶”。
肉眼品世界
2021/01/25
1.6K0
微服务架构中配置中心的选择,Apollo值得拥有
携程开源项目——Apollo的设计与实现
内容来源:2017 年 7 月 22 日,携程框架研发部技术专家宋顺在“携程技术沙龙 | 海量互联网基础架构”进行《携程开源配置中心Apollo的设计与实现》演讲分享。IT 大咖说作为独家视频合作方,经主办方和讲者审阅授权发布。 阅读字数:2580 | 7分钟阅读 摘要 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关、参数的配置、服务器的地址。对程序配置的期望值也越来越高:配置修改后实时生效,分环境、分集群管理配置,完善的权限、审核机制。在这样的大环境下,传统的通过配置文件、数据库等方式已
IT大咖说
2018/04/24
1.7K0
携程开源项目——Apollo的设计与实现
微服务中集成分布式配置中心 Apollo
随着业务的发展、微服务架构的升级,服务的数量、程序的配置日益增多(各种微服务、各种服务器地址、各种参数),传统的配置文件方式和数据库的方式已无法满足开发人员对配置管理的要求:配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制。分布式环境下,这些配置更加复杂。
aoho求索
2019/06/02
8750
快速学习-Apollo从入门到精通
Apollo (阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
cwl_java
2020/08/04
1.6K0
快速学习-Apollo从入门到精通
(很全面)SpringBoot 集成 Apollo 配置中心
. 六、Kubernetes 的 SpringBoot 应用使用 Apollo 配置中心
JAVA葵花宝典
2020/03/31
18.3K0
(很全面)SpringBoot 集成 Apollo 配置中心
Apollo,真香!
今天深入聊一聊携程开源的一款分布式配置中心Apollo,在功能上和Nacos不相上下。
码猿技术专栏
2024/01/09
4020
Apollo,真香!
携程一面分布式配置系统Apollo是如何实时更新配置的?
记得我们那时候刚开始学习Java的时候都只是一个单体项目,项目里面的配置基本都是写在项目里面的properties文件中,比如数据库配置啥的,各种逻辑开关,一旦这些配置修改了,还需要重启项目这修改才会生效。随着各种微服务的诞生,服务的拆分也越来越细,可能涉及的服务成千上百,服务基本也是集群部署,这样再去一个一个项目修改配置,然后重启这显然是行不通的。所以分布式配置中心就诞生了,现在开源的分布式配置中心也挺多的比如:开源分布式配置中心有很多,比如spring-cloud/spring-cloud-config、淘宝/diamond、百度/disconf、携程/apollo、netflix/archaius、Qconf、XDiamond、nacos等等。我们是不是很好奇配置中心如何做到实时更新并且通知到客户端的这也是一个面试中经常会问到的题目。下面我们就以apollo为例吧去分析分析它是如何实现的。为什么选择Apollo来分析列?因为现在的公司就在使用它作为配置中心。虽然Apollo是携程开源的,但是携程内部也不用它。
java金融
2021/11/19
9670
携程一面分布式配置系统Apollo是如何实时更新配置的?
开源配置管理中心apollo使用方法
Apollo(阿波罗)是一款可靠的分布式配置管理中心,诞生于携程框架研发部,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。
星哥玩云
2022/05/28
2.3K0
开源配置管理中心apollo使用方法
相关推荐
基于Linux搭建开源配置管理中心apollo
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档