0

想法是这样的:我希望能够做到这一点,以便我可以更改输入在函数中的重要性。可以说正常功能如下所示:

var f = function(a,b,c,d){
    return a * b / c + d;
}

我希望能够重新定义函数,这样当用户调用时,f(w,x,y,z)如果变量(比如说changed)为真,它的行为就好像用户调用了f(w,z,y,x)!(不是特别按相反顺序,只是与原始函数的顺序不同)

如果我想编写一个以这种方式运行的单独函数,我可以执行以下操作:

var newF = function(a,b,c,d){
    if(changed === true){
        return f(c,d,b,a);
    }
    else{
        return f(a,b,c,d);
    }
}

然后用电话替换所有f电话newF,但这不是我要的。

是否可以重新定义与实际函数同名的函数,以及如何完成?如果我不能,请解释为什么不能。

解释:

我想这样做的原因是因为我有一个应用程序,它具有使一切听起来自然的功能(比如直线中的点是直的),但是如果我切换一些值,它会创建一个有趣的、不切实际的情况,我认为这将是一个有趣的选择。我上面的选项是可行的,我可以使用它,但我只是想知道是否可以将它保留在相同的函数名称中

4

5 回答 5

4

是否可以重新定义与实际函数同名的函数,以及如何完成?

是的,您可以再次分配给它的标识符:

f = function(a,b,c,d) {
    if (changed)
        return a * d / c + b;
    else
        return a * b / c + d;
};

如果您需要调用实际函数,因为您不确切知道它的内容(但想截取它的参数),您可以这样做

f = (function(oldF) {
    return function(a,b,c,d){
        if (changed)
            return oldF(c,d,b,a);
        else
            return oldF(a,b,c,d);
    };
})(f);
于 2013-07-03T14:54:24.890 回答
2
var oldF = f;

f = function( ... ){
    // do stuff
    oldF(...);
};
于 2013-07-03T14:53:55.520 回答
1

使用在运行时返回正确函数的工厂方法。

于 2013-07-03T14:54:08.497 回答
0

除了“你为什么想要”之外,你可以做这样的事情:

var changed = false;

var f = function(a,b) {
    console.log("original function: " + a + "," + b);
}

f = (function(original) {
    return function(a,b) {
        console.log("new function");
         if (changed) {
             console.log("order changed");
             original(b,a);
         }
         else {
              original(a,b);
         }
     }
})(f);

f(1,2);
changed = true;
f(1,2);

将输出(在控制台中):

new function 
original function: 1,2 
new function 
order changed 
original function: 2,1 

小提琴

于 2013-07-03T15:00:47.097 回答
0

好的,首先,只要您定义了这样的函数:

var f = function(...){...};

然后你可以轻松地覆盖它。但是当你这样做时:

function f(...){...}

简单地说,当您使用function f(...){...编译器声明函数时,首先会以这种方式查找每个声明的函数,然后运行您的代码。另一方面,声明为变量 f 将在运行时而不是在预处理期间存储函数。因此这样声明:

function f(){
    console.log('a');
};
f();
function f(){
    console.log('b');
}

f();

将输出b b小提琴 同时像这样:

var f = function () {
    console.log('a');
};
f();
f = function () {
    console.log('b');
}

f();

将输出a b小提琴

现在,我从不将参数放在示例中,因为 JS 不关心类型和参数大小。imo 最好的方法是这样做:

var myProject = {};

myProject.fn = {

    f: function(args,options){
        //in your case while you need a,b,c,d you can use the args array to store them
        //options to define the 'changed' thing or whatever you need
        }

}
于 2013-07-03T14:55:43.220 回答