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

标签:JavaScript,分号,编程
0
投稿

猜你喜欢

  • SqlServer编写数据库表的操作方式(建库、建表、修改语句)

    2024-01-15 11:38:57
  • Python中的面向对象编程详解(上)

    2021-10-12 14:33:45
  • python 调用API接口 获取和解析 Json数据

    2022-01-24 17:57:15
  • Android申请相机权限和读写权限实例

    2023-08-21 18:52:40
  • php中session使用示例

    2024-04-30 08:46:58
  • Python挑选文件夹里宽大于300图片的方法

    2023-08-13 11:35:19
  • 在tensorflow中设置使用某一块GPU、多GPU、CPU的操作

    2023-07-22 11:37:28
  • Python文本特征抽取与向量化算法学习

    2023-07-19 09:44:29
  • Python绘制动态水球图过程详解

    2021-11-27 14:57:20
  • python实现抽奖小程序

    2022-06-10 14:14:29
  • 教你在SQL Server数据库中导入导出数据

    2008-12-09 14:42:00
  • 算法系列15天速成 第十一天 树操作(上)

    2022-08-03 13:03:56
  • 详解微信小程序文件下载--视频和图片

    2023-08-10 16:38:50
  • python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例

    2022-11-27 15:06:22
  • 用nodejs搭建websocket服务器

    2024-05-08 09:36:56
  • python pycurl验证basic和digest认证的方法

    2022-12-17 23:01:15
  • SQL分页查询存储过程代码分享

    2024-01-12 23:51:04
  • php笔记之:初探PHPcms模块开发介绍

    2024-05-11 09:54:26
  • 再谈float菜单局中

    2009-12-21 19:57:00
  • 解决jupyter加载文件失败的问题

    2022-07-21 19:17:05
  • asp之家 网络编程 m.aspxhome.com