JavaScript的键值只能是string或者number,这一点真是返祖现象啊。现在我面临的问题:
var funcs = {};
var funcA = function() {
};
var funcB = function() {
};
var funcC = function(){}
funcs[funcA] = "funcA";
funcs[funcB] = "funcB";
funcs[funcC] = "funcC";
delete funcs[funcA]; //funcs[funcB]也被删除了
//只输出"funcC"
for(var key in funcs) {
console.log(funcs[key]);
}
所以一个最佳实践就是使用数组进行o(n)的操作:
funcs = [];
funcs.push({ "fn": funcA, "des": "funcA" });
funcs.push({ "fn": funcB, "des": "funcB" });
funcs.push({ "fn": funcC, "des": "funcC" });
for(var i = 0; i < funcs.length; i++) {
if(funcs[i].fn === funcA) {
funcs.splice(i, 1);
}
}
//输出"funcB"和"funcC"
for(var i = 0; i < funcs.length; i++) {
console.log(funcs[i].des);
}
但是如果这样就结束了那么我也太无趣了,所以:
i = 0;
var unicon = function(func) {
var temp;
//感谢eval的闭包
eval("temp = function() {/*" + (i++) + "*/func.apply(this, arguments); }");
return temp;
};
var func = function() {
console.log("func");
};
var uniconified = unicon(func);
func = function() {
console.log("dark func");
}
//输出的是"func",不是"dark func"
uniconified();
funcs = {};
uniconifiedFuncA = unicon(funcA);
uniconifiedFuncB = unicon(funcB);
uniconifiedFuncC = unicon(funcC);
funcs[uniconifiedFuncA] = "funcA";
funcs[uniconifiedFuncB] = "funcB";
funcs[uniconifiedFuncC] = "funcC";
delete funcs[uniconifiedFuncA];
//输出"funcB"和"funcC"
for(var key in funcs) {
console.log(funcs[key]);
}