[Effective JavaScript 笔记] 第6长长的:了解分号插入的受制

分公司可以简单

js可以以讲话结束无强制加分号。(建议要长,不弥加分号往往会油然而生是察觉的BUG)

function Point(x,y){

            this.x=x||0;

            this.y=y||0;

}

Point.prototype.isOrigin=function(){

          return this.x===0 && this.y===0

}

方代码可以运行,是由js可以活动插入分号,它是千篇一律种植次解析技术。能推测出某些上下文中概括的支行,然后有效地活动地以分店“插入”到程序中。

ECMAScript标准细心地制订了分店插入机制,可以便宜移植。

支行插入的陷阱

匪可知幸免学习该规则,受分号插入的震慑,js语法有局部附加的限量。

子公司插入的准

先是长条标准

支行仅以}标记之前、一个或者多单换行之后与次序输入的末梢给插。

谈人讲话就是,你只能在一行、一个代码块和相同段先后结束之地方省略分号。

function square(x){

    var n=+x

    return n*n

}

function area(r){r=+r;return Math.PI*r*r}

function add1(x){return x+1}

非合法的

function area(x){r=+r  return  Math.PI*r*r}

老二漫漫标准

分公司仅于就的输入标记不克分析时插入。

人语句:分号插入是一律种错误校正规则。

a=b

(f());

可知分析为同样长条单独的语句,等价于:

a=b(f());

没有分号插入,因为b(f())是一个合法的言语

a=b

f();

会分析为有限条独立的言辞

a=b f();

解析有误。

当时漫漫说明你省略分号的时势必要小心。

出题目的字符

5独引人注目有问题之字符需要密切注意:(、[、+、/。

每个字符都能同日而语一个表达式运算符或同修告词的前缀,依赖让上下文。

小心因表达式结束之话语,如赋值语句。下一行以地方就5个字符的里之一开始,不栽分号。

发生问题太好之是盖(或[初步的言辞。

a=b

[“r”,”g”,”b”].forEach(function(key){

        bakcground[key]=foreground[key]/2;

});

眼看句话会为顶价于

a=b[“r”,”g”,”b”].forEach(function(key){

bakcground[key]=foreground[key]/2;

});

瞩目:中括哀号表达式有点慌,js允许逗号分隔表达式,常用来声明多个变量,逗号分隔符用于赋值时,操作符总会回来最后一个表达式的价值。

ECMAScript 1

 

+、-、/字符出现于讲话开始并无广泛,但为发出这种情景。

+号:

ECMAScript 2

10凡立即运行的结果

NaN是+undefined的结果

/号:出现于说话的开始其实不是一个进口标记,而是正则表达式

ECMAScript 3

/Error/i.test(str)&&fail();

(&&是同样种植死操作,即只要第一个操作数能够控制结果,那么就算非会见再针对亚只操作数求值。)

如/Error/i.test(str)结果也真,才见面实行fail()操作。

然而如若事态如下

a=b

/Error/i.test(str)&&fail();

会让分析为

a=b/Error/i.test(str)&&fail();

/被当成除法运算符了。

思念大概分号,可以于言辞后跟一个宣称,以管教语句不见面受张冠李戴解析。

a=b

var x

(f())

重构时可能为人改变吗

var x

a=b

(f())

尽管上面将var语词提前,这简单段子代码应该是齐价格的。但实际上,b后面跟着的一个括号,会于错地解析为

var x;

a=b(f());

结果,你或如小心省略分号的地方,检查衔接下的一条龙开始之号子是否会面禁止自动插入分号。

或者在(、[、+、/字符的开始坐加一个额外的子公司语句的点子。

a=b

var x

;(f())

今昔将var提前为无见面生错了。

var x

a=b

;(f())

此外一个宽广的状是,省略分号可能致脚本连接问题。每个文件或者是因为大量的函数表达式组成。

file1.js

(function(){

     //…..

})()

file2.js

(function(){

   //…..

})()

当合并减时,结果为视为

(function(){

//….

})()(function(){

//….

})();

简短分号时,不仅使居安思危当前文件的产一个号,而且如果警惕脚论合并时或者出现在言语之后的凭一标志。

可防御性在加以一个前缀的支行以护下本免受合并之震慑。

file1.js

;(function(){

//…..

})()

file2.js

;(function(){

//…..

})()

合并后

;(function(){

//….

})();(function(){

//….

})();

剧本正常运作。

那么不探望略任何分号,是不是就没有问题了呢?也无尽然,如

在打

return {};

时打成

return

{};

尚未返回一个目标,因为上面这句被分析成

return ;

{}

;

3长达单独的语句。

眼看虽是所谓的js语法限制产生式,它不容许以少数只字符中出现换行。如果有换行,可能会见让机关插入分号。

要上面的return 语句。在return关键字与那个可选取参数之间必然不能够冒出转换行.

旁的限量产生式:

  • throw语句
  • 富含显式标签的break或continue语句子
  • 后置自增或打减运算符

末一漫漫是以破除以下状况

a

++

b

会见吃分析为

a;++b;

老三条规则

支行不见面作分隔符在for循环空语句之ECMAScript脑部受活动插入。

人口谈:你得以for循环的满头显式地包含分号。

for(var i=0,len=20

     i<len

     i++

){

   //…

}

面会起语法错误。

ECMAScript 4

空循环的while同样为要显式的分店。否则也会报错

function infiniteLoop(){while(true)}

ECMAScript 5

非得写成

function infiniteLoop(){while(true);}

ECMAScript 6

 

提示

  1. 一味以“}”标记之前、一行的结和次序的结处机关插入分号
  2. 单以随着的号子不可知于解析的上插入分号
  3. 在以(、[、+、-、/字符开头的话语前绝不可知看略分号
  4. 当脚本文件进行连续时,在剧本开头加上防御性的分公司
  5. 以return、throw、 break 、continue、
    ++、 –的参数之前不要会换行
  6. 分公司不能够当做for循环的头要空语句子之相间符而机关插入

ECMAScript 7