全局變量/預解析/For循環的優化/eval()/parseInt()和Number/左花括號的位置

全局變量,你的JavaScript應用程序和web頁面上的所有代碼都共享了這些全局變量。包括:第三方JS庫,廣告代碼...

減少全局變量的方法:最直接的使用var聲明變量,分割命名空間,函數立即執行。

function f(){
  var a = b = 1;
}

該方法會產生出一個意外的全局變量b。分析:

可以理解爲操作是:var a = ( b = 1 ),首先是執行b = 1,這個表達式返回1,然後1賦給a.

隱式創建的全局變量是可以被delete操作的,而var聲明的全局變量是不能被delete操作的

delete a;// =>返回值 false
delete b;//=>返回值true

如果在沒有window屬性的環境中,任何位置,可以用下面的方法來獲取全局變量:

var global = (function () {
   return this;
}());

預解析,在JS中可以在函數的任何位置來用var聲明變量跟在頂部聲明是一樣的,這被稱爲預解析(hoisting)

<pre name="code" class="html">a = "global";
function f(){
  console.log(a);
  var a = "local";
  console.log(a);
}
f();
//=>"undefined"
//=>"local"

這個例子中,a的聲明被提前到函數的頂部,但是賦值不會提前,var a = "local"分爲兩個操作,1.聲明a; 2.把"local"賦值給a。預解析提前的只是聲明!可以理解爲:

a = "global";
function f(){
  var a;
  console.log(a);
  a = "local";
  console.log(a);
}

有個類似的容易混淆的例子:

<pre name="code" class="javascript">function ff(x){
  console.log(x);
  var x = 2;
  console.log(x);
}
ff(1);
//=>1
//=>2

函數的變量跟全局變量不同,該例子中相當於在頂部做了聲明賦值操作:var x = 1; 

For循環的優化

for(var i = 0, max = arr.length;i < max; i += 1){
  console.log(arr[i]);
}

1.緩存length,避免每次循環都要去取;2.用i += 1或者i = i +1來代替i++,這樣貌似在JS中效率更高,小細節,不必太計較。

for-in循環應該用在非數組對象的遍歷上,使用for-in進行循環也被稱爲“枚舉”。

原因:如果數組被自定義的屬性增強,那麼遍歷時可能會有不合邏輯的內容;遍歷的順序無法保證。但是可以用hasOwnProperty()方法過濾原型屬性。

避免用eval(),一個例子就是在setTimeout中:

//use:
setTimeout(myFunc, 1000);
//not:
setTimeout("myFunc()", 1000);
可以用new Function來代替eval:

jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)(); // => 2
另一間eval()和Function構造不同的是eval()可以干擾作用域鏈,而Function()更安分守己些。不管你在哪裏執行 Function(),它只看到全局作用域。所以其能很好的避免本地變量污染。在下面這個例子中,eval()可以訪問和修改它外部作用域中的變量,這是 Function做不來的(注意到使用Function和new Function是相同的)。

(function () {
   var local = 1;
   eval("local = 3; console.log(local)"); // logs "3"
   console.log(local); // logs "3"
}());

(function () {
   var local = 1;
   Function("console.log(typeof local);")(); // logs undefined
}());
parseInt()和Number來轉換數字

parseInt:不是簡單的轉換,而且可能與進制有關,比較保險的做法是parseInt("02", 10),第二個參數是進制,而且parseInt()可以處理非純數字,如parseInt(“10saf”)會返回10。

而Number("007")則更簡單,效率也更高。

左花括號的位置,反面的例子相當於return undefined;:

function func() {
   return
  // 下面代碼不執行
   {
      name : "Batman"
   }
}
幾點習慣
駝峯命名,構造函數首字母大寫,全大寫來設定全局變量或者常量,首字母用_來模擬私有變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章