文章出處

  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哈!


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()