我认为函数可以像Javascript中的普通值一样传递。我认为他们评估了一些地址。从以下示例的输出中,我似乎是对的。
var f = function() { console.info('f'); };
var v = function() { console.info('v'); };
var arr = [];
arr.push(f);
arr.push(f);
arr; // [function(), function()]
arr.uniq(); // [function()]
arr.push(f);
arr.push(f);
arr.push(v);
arr; // [function(), function(), function()]
arr.without(f); // [function()]
arr.first()(); // v
但是,一旦我将此观察应用于“面向对象”的代码,uniq
和without
就停止了工作。
A = Class.create({
initialize: function() {
},
callback: function() {
},
add: function() {
b.add(this.callback.bind(this));
}
remove: function() {
b.remove(this.callback.bind(this));
}
});
a = new A();
B = Class.create({
initialize: function() {
this.funcs = [];
},
add: function(func) {
this.funcs.push(func);
this.funcs = this.funcs.uniq();
},
remove: function(func) {
this.funcs = this.funcs.without(func);
}
});
b = new B();
a.add(); // b.funcs = [function()]
a.add(); // b.funcs = [function(), function()]
a.remove; // b.funcs = [function(), function()]
每次拨打b.add
时,a.funcs
都会变大; uniq
不会删除重复项。每次拨打b.remove
时,a.funcs
都不会缩小; without
未能找到该功能。
在我看来,我每次都会附加解析到不同地址的函数。 bind
每次都会给出一个新地址吗?我该如何解决?我想确保a
的{{1}}中没有两个相同的函数;如果在两个不同的地方定义的两个函数做同样的事情也没关系,但如果同一个函数句柄在数组中两次就不行了。
答案 0 :(得分:2)
你有正确的想法 - JS函数是一等公民,bind
每次调用它都会返回一个新函数。但是,您想要做的事情是不可能的。计算上不可能确定两个不同的函数是否对所有输入做同样的事情。
我前面看过一个类似的问题,让我看看我是否可以把它挖出来。 here it is。