文章出處
文章列表
JS中會自動清除句子和句子之間的空格以及tab縮進, 這樣就可以允許用戶編寫的代碼更加隨性和更加可讀, 在該行代碼解析的時候如果該行代碼可以解析, 就會在該行代碼最后自動填寫分號,如果該行代碼無法解析就會把該行代碼和下一句代碼合并, 直到代碼可以解析;
Js中如果一個語句以 ( [ / + - 開頭,就有可能與上一句合在一起解析
也因為js會自動添加 “;” , 寫js不注意就養成了不好的習慣, 代碼有時候沒事, 跑起來卻出了錯;
比如,少了一個分號就報錯了;
var a y = 1+a (a+y).toString();
我們期望他這么走:
var a y = 1+a; (a+y).toString();
實際上是這樣的:
var a y = 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并不是所有的換行都添加分號, 只有缺少了分號無法執行的時候才添加分號,如:
var a b = 3 console.log(b);
也因為js的自動添加分號機制;
function(){}() 這句話會變成這樣:
function(){};
();
如果期望他正常執行,(湯姆大叔的例子);
// 下面2個括弧()都會立即執行 (function () { /* code */ } ()); // 推薦使用這個 (function () { /* code */ })(); // 但是這個也是可以用的 // 由于括弧()和JS的&&,異或,逗號等操作符是在函數表達式和函數聲明上消除歧義的 // 所以一旦解析器知道其中一個已經是表達式了,其它的也都默認為表達式了 // 不過,請注意下一章節的內容解釋 var i = function () { return 10; } (); true && function () { /* code */ } (); 0, function () { /* code */ } (); // 如果你不在意返回值,或者不怕難以閱讀 // 你甚至可以在function前面加一元操作符號 !function () { /* code */ } (); ~function () { /* code */ } (); -function () { /* code */ } (); +function () { /* code */ } (); // 還有一個情況,使用new關鍵字,也可以用,但我不確定它的效率 // http://twitter.com/kuvos/status/18209252090847232 new function () { /* code */ } new function () { /* code */ } () // 如果需要傳遞參數,只需要加上括弧()
如果有返回值, 比如return, break , continue的代碼后面也不能換行, 導致維護的時候出了問題都無從找起;
//如果這么寫,實際上return的是空值; +function(){ return {a:1} }(); //這個才是對的 +function(){ return {a:1} }()
所以,寫js還是老老實實的加分號吧;
ok了,說了這么多,反正我不寫分號O(∩_∩)O哈!
文章列表
全站熱搜