JavaScript中使用function作为对象键值

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]);
}
原文地址:https://www.cnblogs.com/zhengwenwei/p/3185893.html