OReily Even Faster Websites is a great book. It has some Javascript perfomance hints in its “Writing Efficient JavaScript” part. Here are conclusions:
- Use local variables
- Avoid with statement
- do not use too deep properies, redefine them with locals if possible
- Use the if statement when:
— There are no more than two discrete values for which to test.
— There are a large number of values that can be easily separated into ranges. - Use the switch statement when:
— There are more than two but fewer than 10 discrete values for which to test.
— There are no ranges for conditions because the values are nonlinear. - Use array lookup when:
— There are more than 10 values for which to test.
— The results of the conditions are single values rather than a number of actions
to be taken. - To improve perfomance of loops decrement the iterator toward 0 rather than incrementing toward the total length.
JS features you better know 1
In scope of functions arguments is local variable provides some nice features we can use in our code. First you don’t need to define any parameters for a function. You can just use arguments and will get arguments passed to the function.
function sum(){ var ret = 0; for (var i = 0; i < arguments.length; ++i) { ret += arguments[i]; } return ret; } sum(1, 2, 3) //returns 6Worth noting though that although we use arguments like an array, it’s not an actual javascript Array — it’s just an object. So you can’t do join(), pop(), push(), slice() and so forth.(You can convert it to a real array if you want: “var argArray = Array.prototype.slice.call(arguments);” )
arguments.callee property refers to the function that is currently running. It provides a way for unnamed function to refer to itself. This allows to make nice recursions:
function fibonacci(){ if (arguments.length == 1 && arguments[0] > 2) { return arguments.callee(arguments[0] - 2, [0, 1]); } if (arguments[0] == 0) { return arguments[1]; } else { var len = arguments[1].length; return arguments.callee(arguments[0] - 1, arguments[1].concat(arguments[1][len - 1] + arguments[1][len - 2])); } } fibonacci(7) //returns [0, 1, 1, 2, 3, 5, 8]Notice that “callee” property allows to do recursion with anonymous functions.
arguments.callee.caller property refers to a method called your function. This could be useful for example if you want to forbid public class creating and allow it for Factory only:
function MyClass(){ if (arguments.callee.caller != MyFactory.createObject) { throw new Error("There is no public constructor for MyClass."); } this.myproperty = "hello world"; }