按值(value)传递, 但传过来的参数本身是个引用,因此若修改其内部值,原对象便会修改
var a = { b: 1 }
function c(o) { o.b=2 }
function d(o) { o = {} }
c(a) //a = {b:2}
d(a) //a = {b:2}
arguments.callee
- 存储函数方法&计数的好办法
var store = {
nextId: 1, //#1
cache: {}, //#2
add: function(fn) { //#3
if (!fn.id) { //#3
fn.id = store.nextId++; //#3
return !!(store.cache[fn.id] = fn); //#3
} //#3
}
};
- 记忆 Self-memoizing functions Memoization
function isPrime(value) {
if (!isPrime.answers) isPrime.answers = {}; //#1
if (isPrime.answers[value] != null) { //#2
return isPrime.answers[value]; //#2
} //#2
var prime = value != 1; // 1 can never be prime
for (var i = 2; i < value; i++) {
if (value % i == 0) {
prime = false;
break;
}
}
return isPrime.answers[value] = prime; //#3
}
- 回文
function isPalindrome(text) {
if (text.length <= 1) return true;
if (text.charAt(0) != text.charAt(text.length - 1)) return false;
return isPalindrome(text.substr(1,text.length -2));
}
assert(isPalindrome(""),"blank")
assert(isPalindrome("x"),"single")
assert(isPalindrome("oxo"),"odd")
assert(isPalindrome("abba"),"even")
assert(isPalindrome("abbar"),"not")
- 模拟数组的对象
var elems = {
length: 0, //#1
add: function(elem){ //#2
Array.prototype.push.call(this, elem);
},
gather: function(id){ //#3
this.add(document.getElementById(id));
}
};
- 使用
arguments
数组 - eg: 合并对象;与最大数相乘
function merge(root){ //#1
for (var i = 1; i < arguments.length; i++) {
for (var key in arguments[i]) {
root[key] = arguments[i][key];
}
}
return root;
}
function multiMax(multi){
return multi * Math.max.apply(Math,
Array.prototype.slice.call(arguments, 1)); //#1
}
function.length
&arguments.length
进行函数重载
function addMethod(object, name, fn) {
var old = object[name]; //#1
object[name] = function(){
if (fn.length == arguments.length) //#2
return fn.apply(this, arguments); //#2
else if (typeof old == 'function') //#3
return old.apply(this, arguments); //#3
};
}
- 绑定this
function bind(context,name){ //#1
return function(){ //#1
return context[name].apply(context,arguments); //#1
}; //#1
}