我只是练习了一点JavaScript。我的目标是创建一个函数,可以使用.invoke()调用另一个函数,直到调用.revoke(),然后使函数无效。
后来,我添加了.porcupine(),理论上它应该采用首先调用的函数(在本例中为alert()),然后将其重新应用到原始的“temp”。但问题是,在被撤销后,临时变得不为人知,因此它不能再召唤任何东西了。是否有一些非常明显的东西,我错过了或解决方案是否必须相当混乱?
var denullifier;
function revocable(unary) {
if (denullifier === null)
denullifier = unary;
return {
invoke: function(x) {
return unary(x);
},
revoke: function() {
var nullifier = unary;
unary = null;
return nullifier.apply(this, arguments);
},
porcupine: function() {
unary = denullifier;
return unary.apply(denullifier, arguments);
}
};
};
console.log('----------');
temp = revocable(alert);
temp.invoke(7); ///alerts 7
temp.revoke();
temp.porcupine(); //exception
temp.invoke(7); //doesn't get here
答案 0 :(得分:2)
我不太明白你在做什么,但你的代码存在一些问题。
if (denullifier === null)
denullifier = unary;
denullifier
在这里不为空,它未定义 - 因此不符合条件。
return nullifier.apply(this, arguments);
您不能以这种方式调用alert
,第一个参数必须为null或窗口。
return unary.apply(denullifier, arguments);
同样的。
答案 1 :(得分:1)
这是你的问题:
声明没有值时,var denullifier; function revocable(unary) { if (denullifier === null) denullifier = unary;
denullifier
为undefined
。但是,您正在检查与null
的类型严格相等,这将是false
,因此永远不会设置denullifier
并且porcupine
无法恢复unary
功能。
我建议:
==
代替===
与undefined
typeof denullifier != "function"
denullifier
成为一个全局的静态变量,它将在revocable
个实例之间共享,而是通过put来使它成为特定于实例的函数体内的声明。