避免使用eval或Function建構子
使用eval或Function建構子的代價是非常昂貴的,每次都需要腳本引擎轉換原始碼到可執行程式碼。
此外,使用eval處理字串必須在執行時解釋。
運行緩慢的程式碼:
function addMethod(object, property, code) { object[property] = new Function(code); } addMethod(myObj, 'methodName', 'this.localVar=foo');
運行更快的程式碼:
function addMethod(object, property, func) { object[property] = func; } addMethod(myObj, 'methodName', function () { 'this.localVar=foo'; });
避免使用with
##儘管很方便, with需要附加的查找引用時間,因為它在編譯的時候並不知道作用域的上下沒。
with (test.object) { foo = 'Value of foo property of object'; bar = 'Value of bar property of object'; }
var myObj = test.object; myObj.foo = 'Value of foo property of object'; myObj.bar = 'Value of bar property of object';
不要在性能要求關鍵的函數中使用try-catch-finally
異常處理應該在腳本的高層完成,在異常不是很頻繁發生的地方,例如一個循環體的外面。
如果可能,盡量完全避免使用try-catch-finally。
var object = ['foo', 'bar'], i; for (i = 0; i < object.length; i++) { try { // do something that throws an exception } catch (e) { // handle exception } }
var object = ['foo', 'bar'], i; try { for (i = 0; i < object.length; i++) { // do something } } catch (e) { // handle exception }
避免使用全域變數
如果你在一個函數或其它作用域中使用全域變量,腳本引擎需要遍歷整個作用域去查找他們。 全域作用域中的變數在腳本的生命週期裡都存在,然後局部範圍的會在局部範圍失去的時候被銷毀。
運行緩慢的程式碼:
var i, str = ''; function globalScope() { for (i=0; i < 100; i++) { str += i; // here we reference i and str in global scope which is slow } } globalScope();
function localScope() { var i, str = ''; for (i=0; i < 100; i++) { str += i; // i and str in local scope which is faster } } localScope();
避免在效能要求關鍵的函數中使用for-in
for-in循環需要腳本引擎建立所有可枚舉屬性的列表,並檢查是否與先前的重複。 如果你的for迴圈作用域中的程式碼沒有修改數組,可以預先計算好數組的長度用於在for迴圈中迭代數組。
var sum = 0; for (var i in arr) { sum += arr[i]; }
var sum = 0; for (var i = 0, len = arr.length; i < len; i++) { sum += arr[i]; }
以上是總結一些JavaScript避免使用的函數和語句的詳細內容。更多資訊請關注PHP中文網其他相關文章!