JS自動填寫分號導致的坑

2021-10-05 12:19:57 字數 2188 閱讀 8686

js中會自動清除句子和句子之間的空格以及tab縮排, 這樣就可以允許使用者編寫的**更加隨性和更加可讀, 在該行**解析的時候如果該行**可以解析, 就會在該行**最後自動填寫分號,如果該行**無法解析就會把該行**和下一句**合併, 直到**可以解析;

js中如果乙個語句以(  [ / + -開頭,就有可能與上一句合在一起解析

也因為js會自動新增 「;」 , 寫js不注意就養成了不好的習慣, **有時候沒事, 跑起來卻出了錯;

比如,少了乙個分號就報錯了;

var

ay = 1+a

(a+y).tostring();

我們期望他這麼走:

var

ay = 1+a;

(a+y).tostring();

實際上是這樣的:

var

ay = 1+a(a+y).tostring();

比如,這個也是因為少了乙個分號

var a = 0

[a,2,3].foreach(function(){})

我們期望他這麼走的:

var a = 0

;[a,

2,3].foreach(function(){})

實際上是這樣的:

var a = [a,2,3].foreach(function(){})

也因為js的自動新增分號機制,有下面的問題, 雖然很少人這麼寫:

x = 0

;y = 0;x

++y;

我們期望的是這樣的:

x = 0

;y = 0

;x++;

y;

實際上是這樣的:

x = 0

;y = 0;x;

++y;

js並不是所有的換行都新增分號, 只有缺少了分號無法執行的時候才新增分號,如:

varab

=3console.log(b);

也因為js的自動新增分號機制;

function(){}() 這句話會變成這樣:

function(){};

();

如果期望他正常執行,(湯姆大叔的例子);

//

下面2個括弧()都會立即執行

(function () ()); //

推薦使用這個

(function () )(); //

但是這個也是可以用的

//由於括弧()和js的&&,異或,逗號等操作符是在函式表示式和函式宣告上消除歧義的

//所以一旦解析器知道其中乙個已經是表示式了,其它的也都預設為表示式了

//不過,請注意下一章節的內容解釋

var i = function () ();

true && function () ();

0, function () ();

//如果你不在意返回值,或者不怕難以閱讀

//你甚至可以在function前面加一元操作符號

!function () ();

~function () ();

-function () ();

+function () ();

//還有乙個情況,使用new關鍵字,也可以用,但我不確定它的效率

//new function ()

new function () () //

如果需要傳遞引數,只需要加上括弧()

如果有返回值, 比如return, break , continue的**後面也不能換行, 導致維護的時候出了問題都無從找起;

//

如果這麼寫,實際上return的是空值;

+function()

}();

//這個才是對的

+function()

}()

所以,寫js還是老老實實的加分號吧;

ok了,說了這麼多,反正我不寫分號o(∩_∩)o哈!

JS自動插入分號規則

首先應該知道哪些語句會用到自動插入分號 automatic semisolon insertion,asi 空語句 var語句 表示式 do while語句 continue語句 break語句 return語句 throw語句 asi的具體規則,在此規範中描述 11.9.1 rules of au...

JS分號自動插入的ASI機制

規範理論 es5 標準定義了自動分號插入規則,包括以下三個基本規則加兩個前置條件 前置條件 1 如果插入分號後解析結果是空語句,那麼不會自動插入分號。例子 空語句,else 前不加分好 if a b else c d 2 如果插入分號後它成為 for 語句頭部的兩個分號之一,那麼不會自動插入分號。例...

JS傳遞陣列自動以分號分隔

今天在家做公司的專案,遇到乙個很奇怪的事,其中js傳遞陣列時,傳遞過去的資料會以,分號 分隔。如下 function expertopinion var url servlet makescoreaction var paras iditem iditem idoperate idoperate o...