浅谈javascript的分号[译]
作者:jiangwei2004 来源:蓝色理想 发布时间:2009-12-13 10:34:00
javascript的分号代表语句的结束符,但由于javascript具有分号自动插入规则,所以它是一个十分容易让人模糊的东西,在一般情况下,一个换行就会产生一个分号,但实际情况却不然,也就是说在javascript中换行可能产生分号,也可能不产生,是否自动插入分号,主要看上下行。所以即使是经验丰富的程序员,有时候也会头大。
在 ECMAScript 中对分号自动插入规则也有相应的解释:空语句,变量语句,表达式语句,do-while 语句,continue 语句,break 语句,return 语句,以及 throw 语句,这些确定的ECMAScript语句必须以分号结束。这些分号可以总是明确地出现在源代码文本中。为方便起见,在特定的情况下,源代码文本中的这些分号可以被省略。也就是说这些语句的结尾是不需要硬性的输入分号结尾,javascript会自动插入语句结束处。
想了解详细的ECMAScript分号自动插入规则可以查看以下链接:
实践出真理,看一下下面这些例子,就明白,分号自动插入不是那么好让人捉摸的。稍微不注意就会让你头大。
return引起的血案
function test(){
var a = 1;
var b = 2;
return //会自动插入分号
(
a+b
)
};
alert(test());
一个返回a+b值的函数,初看没任何问题,但运行alert的结果却是undefined。根据分号的自动插入规则,return 语句后面如果有换行就会自动插入分号,没有返回值也就比较好理解了。如果需要换行的话,可以这样:
function test(){
var a = 1;
var b = 2;
return (
a+b
)
};
alert(test());
两个闭包引起的血案
(function (){
var a;
})() //不会自动插入分号
(function (){
var b;
})()
很诡异,解释不了,谁能告诉我~
for语句头中的两个分号,不自动插入分号
for( var a=1,b=10 //不会自动插入分号
a<b //不会自动插入分号
a++
)
{}
ECMAScript对以上也有解释:将分号解释为空语句和在for语句中的()中不自动插入分号是特例,是不属于自动插入规则管辖的。
javascript虽然是弱类型语言,ECMAScript的分号自动插入规则也让人难以理解透彻。但养成良好的代码书写习惯,手动插入分号,养成习惯,就能避免这些问题,同时会在程序调试,代码的阅读上对自己对他人都有不小的帮助。
同时ECMAScript还给程序员一些忠告:
++ 或 — 应和其操作数出现在同一行。
return 或 throw 语句中的表达式应和return 或 throw 出现在同一行。
break 或 continue 语句中的标签应和break 或 continue 出现在同一行。


猜你喜欢
- 环境:Anaconda自带的编译器——Spyder最近才开使用conda,发现conda 就是 yyds,爱啦~一、Tensor(张量)im
- 说明Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码。从Python3.2开
- 前言:枚举(enumeration)在许多编程语言中常被表示为一种基础的数据结构使用,枚举帮助组织一系列密切相关的成员到同一个群组机制下,一
- 首先是建表语句 CREATE TABLE `t_address_province` ( `id` INT AUTO_INCREMENT PR
- 在 asp 应用中,经常用到 Session 对象来保存用户临时私有数据,而 asp 的 Session 对象是依赖于浏览器的 Cookie
- 需求描述有时候我们会基于已有数据生成一列在表格中,类似于下面的class BaseSchema(models.Model): ... def
- Notepad++ 是一款非常有特色的编辑器,软件小巧高效,支持27种编程语言,通吃C,C++ ,Java ,C#, XML, HTML,
- 首先得抛出个重要的前提观点,大屏幕、宽屏幕根本不是为方便“扫视”准备的。所以说以内容为基础的网站设计不用考虑超宽、超大的场景,甚至包括服务类
- js代码:window.alert = function(msg, callback) {var div = document.create
- “小程序”破解IDE + Demo:https://github.com/gavinkwoe/weapp-ide-crack.git资源汇总
- 北京邮电大学 张剑XML的局限性目前,许多Web网站的内容数据都存放在数据库或数据文件中。对于Web程序开发人员来说,如果要想把有用的信息从
- 环境介绍python3.8numpymatplotlib第一步,绘制一个三维的爱心关于这一步,我采用的是大佬博客中的最后一种绘制方法。当然,
- 可用下列函数来产生你需要的东西,将它们发送给用户就可以啦:<%response.write makePassword(16)
- 对单词最后一个字母的预测LSTM 的原理自己找,这里只给出简单的示例代码,就是对单词最后一个字母的预测。# LSTM 的原理自己找,这里只给
- 在ASP.NET中,使用C#连接SQL数据库,并使用SQL语句查询,以前从来没有接触过C#,最近用到了,摸索了两天终于运行起来了,Mark一
- 本实例的实现逻辑是,应用selenium UI自动化登录百度盘,读取存储百度分享地址和提取码的txt文档,打开百度盘分享地址,填入提取码,然
- 想把python提取出来的 加载点反力和某个单元的应力画在同一个XY曲线图上,由于两者数量级差太远,故而需要建立有两个Y轴的XY曲线图。效果
- Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes
- 实验环境:windows 7,anaconda 3(python 3.5),tensorflow(gpu/cpu)函数介绍:所用函数为six
- Array.prototype中定义了很多操作数组的方法,下面介绍ECMAScript3中的一些方法1.Array.join()方法该方法将