你能有效地重置功能输入顺序吗

Can you reset function input order efficiently?

本文关键字:输入 顺序 功能 有效地      更新时间:2023-09-26

这里有一个想法:我希望能够做到这一点,这样我就可以改变函数中输入的顺序。假设正常函数看起来是这样的:

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

我希望能够重新定义函数,这样当用户调用f(w,x,y,z)时,如果变量(比方说changed)为true,它就好像用户调用了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);
    }
}

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

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

说明:

我之所以想这么做,是因为我有一个应用程序,它有一个功能,可以让一切听起来都很自然(就像直线上的点是直的),但如果我切换一些值,它会产生一个有趣、不切实际的情况,我认为这将是一个有趣的选择。我上面的选项是可行的,我可以使用它,但我只是想知道是否可以将它保留在相同的函数名

是否可以重新定义与实际函数同名的函数,以及如何做到这一点?

是的,您可以重新分配给它的标识符:

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);
var oldF = f;
f = function( ... ){
    // do stuff
    oldF(...);
};

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

除了"你为什么要",你还可以做这样的事情:

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 

小提琴

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

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
        }
}