在JavaScript中恢复无效函数

时间:2014-01-31 09:22:32

标签: javascript function functional-programming prototypal-inheritance

我只是练习了一点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

2 个答案:

答案 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;
声明没有值时,

denullifierundefined。但是,您正在检查与null的类型严格相等,这将是false,因此永远不会设置denullifier并且porcupine无法恢复unary功能。

我建议:

  • 使用==代替===undefined
  • 取得平等
  • 更好的是,使用typeof denullifier != "function"
  • 或者,(虽然我不知道你的设计)你不应该让denullifier成为一个全局的静态变量,它将在revocable个实例之间共享,而是通过put来使它成为特定于实例的函数体内的声明。