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

时间:2013-07-03 14:41:32

标签: javascript function

这是一个想法:我希望能够做到这一点,以便我可以改变函数中输入的顺序。让我们说正常函数看起来像这样:

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

我希望能够重新定义该函数,以便当用户调用f(w,x,y,z)时,如果变量(假设为changed)为真,则其行为就像用户调用{{1} }! (具体不是相反的顺序,只是与原始函数不同的顺序)

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

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次来电,但这不是我要问的。

是否可以重新定义与实际功能同名的功能,以及如何完成?如果我不能,请解释原因。

说明:

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

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

var oldF = f;

f = function( ... ){
    // do stuff
    oldF(...);
};

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

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

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

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

f();

将输出b bfiddle 像这样:

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

f();

将输出a bfiddle

现在,我从未将参数放在示例中,因为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
        }

}

答案 4 :(得分: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 

fiddle