是否可以重写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,

为了掌握函数式编程的诀窍,我一直在重写许多JavaScript的高阶函数,而我一直停留在
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
的问题。