全局變量,你的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"
}
}
幾點習慣:駝峯命名,構造函數首字母大寫,全大寫來設定全局變量或者常量,首字母用_來模擬私有變量