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 出现在同一行。

【转】javascript 分号问题的更多相关文章

  1. JavaScript 分号使用总结

    没有应该不应该,只有你自己喜欢不喜欢.JavaScript 语法长得 C-like 不代表它本质上和 C 是一类语言,所有直觉性的 "当然应该加分号" 都是保守的.未经深入思考的草 ...

  2. javascript 分号理解

    javascript自动填补分号的规则 在说要不要写分号之前,先了解一下javascript自动填补分号的规则. 在<javascript权威指南>中有一段话“如果一条语句以“(”.“[” ...

  3. Javascript分号,加还是不加?

    关于这个问题,网上已经有很多人讨论过了,我先说说自己对这个问题的回答:加!(但非必须) 有些人写代码,懒得加分号,除非是迫不得已才勉强放一个分号上去.如果你可以保证你写的代码不出现任何 bug,那当然 ...

  4. webstorm javascript 分号提示如何自动补全或去掉?

    转载于: https://segmentfault.com/q/1010000006930809?_ea=1180552 如图片显示,每行末尾都会提示你加上分号,如何让IDE自动完成这个操作或者取消这 ...

  5. auto semicolon insertion 自动分号补齐的坑

    今天发现js自动分号补齐的坑,来看如下两段代码: function Hello(){ return { name: ’JavaScript’ }; } alert(Hello()); //输出unde ...

  6. 初识javaScript(慕课网学习笔记)

    js输出 window.alert() 警告框 document.write() 写到HTML文档中 innerHTML 写到HTML元素 console.log() 写到浏览器的控制台 <!D ...

  7. php笔记篇(二)

    mysql中key .primary key .unique key 与index区别(http://www.manongjc.com/article/1487.html) php is_file() ...

  8. php 编程笔记分享 - 非常实用

    php opendir()列出目录下所有文件的两个实例 php opendir()函数讲解及遍历目录实例 php move_uploaded_file()上传文件实例及遇到问题的解决方法 php使用m ...

  9. ECMAScript 5.0 基础语法(上)

    银子: 一般来说,一门编程语言的基础语法都是大同小异的.比如,python的基础语法,包括:数据类型,变量,作用域,运算符,流程控制(if...else...语句),循环,编码,数据类型的操作(增删改 ...

随机推荐

  1. Android开发技巧——TextView加载HTML的图片及代码显示问题

    前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的 ...

  2. Dynamics CRM2013 Server2012下部署ADFS和IFD遇到的问题No Organization were retrived

    最近一直在折腾Windows Server2012下的IFD部署,其中各种纠结啊错误百出,要想顺利的一步到位只能说看你的RP怎么样了,具体的操作过程推荐看下勇哥的博客:http://luoyong02 ...

  3. Java关键字之this

    this的作用: 1) this是当前对象的一个引用,便于对当前对象参数的使用: 2)可以返回对象的自己这个类的引用,同时还可以在一个构造函数当中调用另一个构造函数 this示例: public cl ...

  4. 聊聊javaMail

    今天闲着无事 看了看用java发送邮件的相关知识 代码参考自<<精通Java Web整合开发(JSP+AJAX+Struts+Hibernate)>>(第2版) 不多说 先上图 ...

  5. Android平台根目录文件

    > 系统分区 # adb shell # mount rootfs / rootfs ro 0 0 tmpfs /dev tmpfs rw,mode=755 0 0 devpts /dev/pt ...

  6. Gradle 1.12用户指南翻译——第二十四章. Groovy 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  7. 程序员编程艺术:第三章续、Top K算法问题的实现

    程序员编程艺术:第三章续.Top K算法问题的实现 作者:July,zhouzhenren,yansha.     致谢:微软100题实现组,狂想曲创作组.     时间:2011年05月08日    ...

  8. 苹果新的编程语言 Swift 语言进阶(十四)--扩展

    扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...

  9. 机房收费系统之导出Excel

            刚开始接触机房收费的时候,连上数据库,配置ODBC,登陆进去,那窗体叫一个多,不由地有种害怕的感觉,但是有人说,每天努力一点点,就会进步一点点,不会的就会少一点点,会的就会多一点点.. ...

  10. onDraw(canvas)和dispatchDraw(canvas)方法

    绘制VIew本身的内容,通过调用View.onDraw(canvas)函数实现 绘制自己的孩子通过dispatchDraw(canvas)实现 View组件的绘制会调用draw(Canvas canv ...