js中會自動清除句子和句子之間的空格以及tab縮排, 這樣就可以允許使用者編寫的**更加隨性和更加可讀, 在該行**解析的時候如果該行**可以解析, 就會在該行**最後自動填寫分號,如果該行**無法解析就會把該行**和下一句**合併, 直到**可以解析;
js中如果乙個語句以( [ / + -開頭,就有可能與上一句合在一起解析
也因為js會自動新增 「;」 , 寫js不注意就養成了不好的習慣, **有時候沒事, 跑起來卻出了錯;
比如,少了乙個分號就報錯了;
varay = 1+a
(a+y).tostring();
我們期望他這麼走:
varay = 1+a;
(a+y).tostring();
實際上是這樣的:
varay = 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...