1. eval問題正則表達式
有eval的代碼比沒有eval的代碼慢100倍以上。主要緣由是:函數
JavaScript 代碼在執行前會進行相似「預編譯」的操做:首先會建立一個當前執行環境下的活動對象,並將那些用 var 申明的變量設置爲活動對象的屬性,可是此時這些變量的賦值都是 undefined,並將那些以 function 定義的函數也添加爲活動對象的屬性,並且它們的值正是函數的定義。可是,若是你使用了「eval」,則「eval」中的代碼(實際上爲字符串)沒法預先識別其上下文,沒法被提早解析和優化,即沒法進行預編譯的操做。因此,其性能也會大幅度下降。性能
2. 函數的做用域鏈優化
依據函數的做用域鏈去訪問變量等操做也是一個影響效率的因素。所以在函數內對於非當前做用域內變量的訪問,咱們能夠利用局部變量保存訪問的結果,從而減小訪問的次數,達到提升效率的目的。spa
3. 慎用with對象
慎用with的緣由是with增長了做用域鏈的層級。在with語句中訪問with外的變量至關於訪問上一層做用域中的變量。所以,會下降JavaScript的執行效率。ip
4. String相關作用域
var str = 「12345678」,字符串
arr = []; it
for(var i = 0; i <= s.length; i++) {
arr.push( str.charAt(i));
}
在調用.charAt時,str會隱式轉換爲new String("12345678").
對於以下代碼也會產生臨時對象:
for(var i = 0; i < str_array.length; i++) {
str_array[i].match(/^s*extra\s/);
}
/^s*extra\s/ 這個會產生臨時正則表達式對象。
var reg = /^s*extra\s/;
for(var i = 0; i < str_array.length; i++) {
str_array[i].match(reg );
}
這樣便不會有臨時對象產生和銷燬的開銷了。