0

我只是在练习一点JavaScript。我的目标是创建一个可以使用.invoke()调用另一个函数的函数,直到调用.revoke(),然后使该函数无效。用JavaScript恢复无效函数

后来,我添加了.porcupine(),理论上它应该首先调用函数(在本例中为alert()),然后将其重新应用到原始“temp”。但问题是,在被撤销后,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 

回答

1

这是你的问题:

var denullifier; 

function revocable(unary) { 
    if (denullifier === null) 
    denullifier = unary; 

denullifier没有值声明时是undefined。但是,您正在检查类型严格等于null,这将是false,因此denullifier从不设置,porcupine无法恢复unary函数。

我建议:

  • 使用==代替===获得与undefined
  • 更妙的是平等的,使用typeof denullifier != "function"
  • 或者,(虽然我不知道你的设计),你应该不会使denullifier成为一个全局静态变量,它将在revocable实例中共享,而是通过将声明放入函数体中使其成为特定实例。
2

我不太明白你在做什么,但是你的代码有几个问题。

if (denullifier === null) 
    denullifier = unary; 

denullifier不为空在这里,它是不确定的 - 这样的条件不满足。

return nullifier.apply(this, arguments);  

不能调用alert这样,第一个参数必须为null或窗口。

return unary.apply(denullifier, arguments); 

相同。

+0

+1,我完全错过了'WRONG_THIS_ERROR' :-) – Bergi