Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中恢复已取消的函数_Javascript_Function_Functional Programming_Prototypal Inheritance - Fatal编程技术网

在JavaScript中恢复已取消的函数

在JavaScript中恢复已取消的函数,javascript,function,functional-programming,prototypal-inheritance,Javascript,Function,Functional Programming,Prototypal Inheritance,我只是在练习一点JavaScript。我的目标是创建一个函数,该函数可以使用.invoke()调用另一个函数,直到调用.revoke(),然后使该函数为空 稍后,我添加了.porcupine(),从理论上讲,它应该首先调用函数(在本例中为alert()),然后将其重新应用于原始的“temp”。问题是,在被撤销后,temp变得未知,因此它不能再调用任何东西。是否有一些非常明显的问题我遗漏了,或者解决方案必须相当混乱 var denullifier; function revocable(unar

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

稍后,我添加了.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
这就是你的问题:

denullizer
在声明时没有值,则为
未定义的
。但是,您正在检查类型是否与
null
严格相等,这将是
false
,因此从不设置
Denullizer
,并且
porcupine
无法恢复
一元
功能

我建议:

  • 使用
    =
    而不是
    =
    未定义的
    相等
  • 更好的方法是使用
    typeof Denullizer!=“功能”
  • 或者,(尽管我不知道您的设计),您不应该使
    去核化器
    成为一个全局静态变量,它将在
    可撤销的
    实例之间共享,而是通过将声明放在函数体中使其特定于实例
    • 这是您的问题:

      denullizer
      在声明时没有值,则为
      未定义的
      。但是,您正在检查类型是否与
      null
      严格相等,这将是
      false
      ,因此从不设置
      Denullizer
      ,并且
      porcupine
      无法恢复
      一元
      功能

      我建议:

      • 使用
        =
        而不是
        =
        未定义的
        相等
      • 更好的方法是使用
        typeof Denullizer!=“功能”
      • 或者,(尽管我不知道您的设计),您不应该使
        去核化器
        成为一个全局静态变量,它将在
        可撤销的
        实例之间共享,而是通过将声明放在函数体中使其特定于实例
        • 这是您的问题:

          denullizer
          在声明时没有值,则为
          未定义的
          。但是,您正在检查类型是否与
          null
          严格相等,这将是
          false
          ,因此从不设置
          Denullizer
          ,并且
          porcupine
          无法恢复
          一元
          功能

          我建议:

          • 使用
            =
            而不是
            =
            未定义的
            相等
          • 更好的方法是使用
            typeof Denullizer!=“功能”
          • 或者,(尽管我不知道您的设计),您不应该使
            去核化器
            成为一个全局静态变量,它将在
            可撤销的
            实例之间共享,而是通过将声明放在函数体中使其特定于实例
            • 这是您的问题:

              denullizer
              在声明时没有值,则为
              未定义的
              。但是,您正在检查类型是否与
              null
              严格相等,这将是
              false
              ,因此从不设置
              Denullizer
              ,并且
              porcupine
              无法恢复
              一元
              功能

              我建议:

              • 使用
                =
                而不是
                =
                未定义的
                相等
              • 更好的方法是使用
                typeof Denullizer!=“功能”
              • 或者,(尽管我不知道您的设计),您不应该使
                去核化器
                成为一个全局静态变量,它将在
                可撤销的
                实例之间共享,而是通过将声明放在函数体中使其特定于实例

                • 我不太明白您在做什么,但您的代码有一些问题

                   if (denullifier === null)
                      denullifier = unary;
                  
                  Denullizer
                  在这里不是null,它是未定义的-因此不满足条件

                      return nullifier.apply(this, arguments);       
                  
                  不能通过这种方式调用
                  警报
                  ,第一个参数必须为null或window

                      return unary.apply(denullifier, arguments);
                  

                  同样。

                  我不太明白您在做什么,但是您的代码有一些问题

                   if (denullifier === null)
                      denullifier = unary;
                  
                  Denullizer
                  在这里不是null,它是未定义的-因此不满足条件

                      return nullifier.apply(this, arguments);       
                  
                  不能通过这种方式调用
                  警报
                  ,第一个参数必须为null或window

                      return unary.apply(denullifier, arguments);
                  

                  同样。

                  我不太明白您在做什么,但是您的代码有一些问题

                   if (denullifier === null)
                      denullifier = unary;
                  
                  Denullizer
                  在这里不是null,它是未定义的-因此不满足条件

                      return nullifier.apply(this, arguments);       
                  
                  不能通过这种方式调用
                  警报
                  ,第一个参数必须为null或window

                      return unary.apply(denullifier, arguments);
                  

                  同样。

                  我不太明白您在做什么,但是您的代码有一些问题

                   if (denullifier === null)
                      denullifier = unary;
                  
                  Denullizer
                  在这里不是null,它是未定义的-因此不满足条件

                      return nullifier.apply(this, arguments);       
                  
                  不能通过这种方式调用
                  警报
                  ,第一个参数必须为null或window

                      return unary.apply(denullifier, arguments);
                  
                  同样的