我正在以这种方式将一些匿名函数推送到数组中:
myArray.push(function(){ /* some cool code here */});
myArray.push(function(){ /* some cooler code here */});
然后我执行所有正在执行的功能
while (myArray.length) { myArray.shift().call();}
问题是:我如何检查某个功能是否已经进入myArray
?我尝试使用toSource()
进行比较,但它不起作用......有什么想法吗?
提前致谢。
答案 0 :(得分:1)
将函数比较为字符串:
func1.toString() === func2.toString()
这甚至可以用于匿名函数,但假设相同的意思是具有相同的代码,字符的字符。
答案 1 :(得分:1)
您可以使用Array.prototype.indexOf
检查您的阵列是否具有该功能:
var foo = function () {};
var bar = function () {};
var arr = [];
var addFunction = function (f) {
if (arr.indexOf(fn) === -1) {
arr.push(fn);
}
};
addFunction(foo);
addFunction(foo);
console.log(arr.indexOf(foo)); // prints 0
console.log(arr.indexOf(bar)); // prints -1
您还可以创建地图以检查是否添加了此功能:
var foo = function foo() {};
var bar = function bar() {};
var arr = [];
var map = {};
var addFunction (fn) {
if (!map[fn.name]) {
arr.push(fn);
map[fn.name] = fn;
}
};
addFunction(foo);
addFunction(foo);
console.log(arr.indexOf(foo), map['foo']); // prints 0, function foo() { ... }
console.log(arr.indexOf(bar), map['bar']); // prints -1, undefined
注意:第二个示例可能不适用于匿名函数。
答案 2 :(得分:0)
当您向列表中添加函数时,请保留一个单独的对象,您可以在其中记录某种标识符,以便检查该函数是否已添加到数组中:
var myArray = [], addedFunctions = {};
for (var i = 0; i < whatever; ++i) {
// do whatever
if (something) {
if (!addedFunctions[ "cool code 1" ]) {
myArray.push(function() { /* cool code 1 */ });
addedFunctions[ "cool code 1" ] = true;
}
}
if (somethingElse) {
if (!addedFunctions[ "cool code 2" ]) {
myArray.push(function() { /* cool code 2 */ });
addedFunctions[ "cool code 2" ] = true;
}
}
}