是否可以重写JavaScript';什么是应用函数?
为了掌握函数式编程的诀窍,我一直在重写许多JavaScript的高阶函数,而我一直停留在是否可以重写JavaScript';什么是应用函数?,javascript,functional-programming,overriding,Javascript,Functional Programming,Overriding,为了掌握函数式编程的诀窍,我一直在重写许多JavaScript的高阶函数,而我一直停留在apply上。是否可以用JavaScript编写apply?假设存在所有其他本机函数,并且正在使用ES5规范。对于ES5及以下版本,我认为如果不使用eval(见下文),您就无法完成此任务。您几乎可以通过args.length上的massible开关station来完成,但在某些情况下,您只需说开关中的案例数是有限的 Function.prototype.newApply = function(thisArg,
apply
上。是否可以用JavaScript编写apply
?假设存在所有其他本机函数,并且正在使用ES5规范。对于ES5及以下版本,我认为如果不使用eval
(见下文),您就无法完成此任务。您几乎可以通过args.length
上的massible开关station来完成,但在某些情况下,您只需说开关中的案例数是有限的
Function.prototype.newApply = function(thisArg, args) {
switch (args.length) {
case 0: return this.call(thisArg);
case 1: return this.call(thisArg, args[0]);
case 2: return this.call(thisArg, args[0], args[1]);
// etc..
default: throw new Error("She canna tek any more!");
}
};
但是,如果您允许eval
,您完全可以这样做-建议eval
,完全归功于:
Function.prototype.newApply = function(thisArg, args) {
var f = this,
call = "f.call(thisArg",
i;
for (i = 1; i < args.length; ++i) {
call += ", args[" + i + "]";
}
call += ")";
return eval(call);
};
Function.prototype.newApply=Function(thisArg,args){
var f=这个,
call=“f.call(thisArg”,
我
对于(i=1;i
现场示例:
Function.prototype.newApply=Function(thisArg,args){
var f=这个,
call=“f.call(thisArg”,
我
对于(i=0;i
对于ES5及以下版本,我认为如果不使用eval
(见下文),您无法做到这一点。您几乎可以通过args.length
上的massible开关station来完成,但在某些情况下,您只需说开关中的案例数是有限的
Function.prototype.newApply = function(thisArg, args) {
switch (args.length) {
case 0: return this.call(thisArg);
case 1: return this.call(thisArg, args[0]);
case 2: return this.call(thisArg, args[0], args[1]);
// etc..
default: throw new Error("She canna tek any more!");
}
};
但是,如果您允许eval
,您完全可以这样做-建议eval
,完全归功于:
Function.prototype.newApply = function(thisArg, args) {
var f = this,
call = "f.call(thisArg",
i;
for (i = 1; i < args.length; ++i) {
call += ", args[" + i + "]";
}
call += ")";
return eval(call);
};
Function.prototype.newApply=Function(thisArg,args){
var f=这个,
call=“f.call(thisArg”,
我
对于(i=1;i
现场示例:
Function.prototype.newApply=Function(thisArg,args){
var f=这个,
call=“f.call(thisArg”,
我
对于(i=0;i
“假设所有其他本机函数都存在。”因此,您可以使用函数#调用
?您到底想实现什么?不想真正实现什么,只是为了学习体验。除非目标函数支持curry,否则您的运气很差。“假设所有其他本机函数都存在。”所以你可以使用函数#call
?你到底想实现什么?不是真的想实现什么,只是为了学习体验。除非目标函数支持咖喱,否则你就太倒霉了。@blex恐怖,丑陋,但有趣:)@blex-创新,但我担心它在一般情况下是失败的:它只适用于那些需要通过成为字符串进行往返的事情。举个例子,任何接受对象引用的函数都不起作用。Good point@t.J.Crowder,我接受这个答案。尽管这是一个相当有创意(同时也是可怕的)的解决方案@blex@blex:但有了eval
,一切皆有可能——你激励了我,上天保佑;我想了一种方法来使用eval
@MarcusBuffett:我添加了一个eval
选项,完全实现了它,感谢blex提出了eval
@blex可怕、丑陋但有趣的问题:)@blex-创新,但我担心它在一般情况下是失败的:它只适用于那些需要通过成为字符串进行往返的事情。举个例子,任何接受对象引用的函数都不起作用。Good point@t.J.Crowder,我接受这个答案。尽管这是一个相当有创意(同时也是可怕的)的解决方案@blex@blex:但有了eval
,一切皆有可能——你激励了我,上天保佑;我已经想到了一种使用eval
@MarcusBuffett的方法:我添加了一个eval
选项,它完全实现了这一点,这要感谢blex提出了eval
的问题。