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