这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要介绍了 javascript 分号总结及详细介绍的相关资料, 需要的朋友可以参考下
javascript 每条语句都是以分号结束,但由于 javascript 具有分号自动插入规则,所有不同的编程人员有不同的习惯,有的加分号,有的不加分号,那么到底加分号好还是不加分号好?本文章向大家探讨 javascript 每条语句该不该加分号。
javascript 的分号代表语句的结束符,但由于 javascript 具有分号自动插入规则,所以它是一个十分容易让人模糊的东西,在一般情况下,一个换行就会产生一个分号,但实际情况却不然,也就是说在 javascript 中换行可能产生分号,也可能不产生,是否自动插入分号,主要看上下行。所以即使是经验丰富的程序员,有时候也会头大。
JavaScript 自动加分号规则:
接下来我们来分组看不加分号导致的语法歧义:
第一种是 ++ 和 -- 两种运算符出现在上一行结尾的情况,下一行以以下开头时,会产生语法歧义: function delete void typeof new null true false NumericLiteral StringLiteral RegularExpressionLiteral ( [ { Identifier ++ -- + - ~ ! 其中,function 和 delete 是非常常用的 statement 开头。 特别是 ++ 和 -- 单独被断为一行的时候,因为 JS 的语法规则规定后自增运算不允许中间插入换行,所以 ++ 和 -- 会被视为前自增而跟下一行连接在一起。
第二种是 return 作为上一行结尾的情况,下一行以以下开头时,会产生语法歧义: function delete void typeof ( [ { Identifier ++ -- + - ~ !
同样因为 JS 语法的规则不允许在 return 和后面的值之间插入换行,所以 return 之后只要有换行符就会视为有分号,这常常会与使用者的期望不符合。
第三种是下一行以 + 和 - 开头的情况,上一行以以下结尾是,会产生语法歧义: -- ++ IdentifierName ] ) } RegularExpressionLiteral
因为很少有语句以 + 或者 - 开头,所以这种情况不算危险。
第四种是上一行以 break、continue 结尾的情况,下一行以 Identifier 开头时,会产生语法歧义。
第五种是下一行以 (和 [开头的情况,上一行以以下结尾是,会产生语法歧义: -- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this 这种情况非常危险(所以 hax 的文章中要提出这种情况应该语句前写分号),几乎上一行的所有情况都将导致正常期望之外的结果。
第六种是,当下一行以 RegularExpressionLiteral 开头的情况,上一行的以下结尾,会导致 / 被理解为除号: -- ++ IdentifierName ] ) } RegularExpressionLiteral StringLiteral NumericLiteral BooleanLiteral NullLiteral Identifier this
实践出真理,看一下下面这些例子,就明白,分号自动插入不是那么好让人捉摸的。稍微不注意就会让你头大。
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++
- )
- {}
总结
来源: http://www.phperz.com/article/17/0520/331625.html