是否可以在不改变行为的情况下重新定义部分javascript函数?

时间:2014-04-12 10:15:01

标签: javascript

我需要定义一个回调,它将由外部库调用。使用1个参数调用此回调:

function(item) {};

在我的情况下,我需要包含第二个参数,我目前通过使用' bind'方法

function(item) {
   var value = this.value
}.bind({'value': value});

每次我需要定义一个回调函数时,我都不想写这个。相反,我想写这样的东西:

function(item, value) {};

然后将其转换为bind方法以满足外部库。

这可能吗?或者还有其他方法可以做到这一点吗?

由于

2 个答案:

答案 0 :(得分:1)

您想要使用闭包。这是基本模式,虽然不像georg建议的那么简单。但是在性能方面,并没有那么大的打击(接近最小)。

定义一个函数:

myValueFunction(value, fn){
  return fn;
}

由于您似乎在说您的插件正在提供item并且您提供value,因此您将myValueFunction(yourvalue, function(item){})设置为插件的回调函数(具有您的实际值)作为参数)。它将“返回”另一个函数,其值包含一个参数(item)。

例如,如果你有一个插件:

var myValue= "x";
plugin.doSomething("Plugin Argument", myValueFunction(myValue, function(item){
  console.log(item, value);
}));

这基本上就是georg的答案(他的方式更为通用),但是如果你直接定义这些函数,他的方法在性能上会慢得多,特别是如果你开始添加很多参数。 / p>

答案 1 :(得分:0)

您可以使用here中的function.partial实现:

Function.prototype.partial = function(){
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function(){
      var arg = 0;
      for ( var i = 0; i < args.length && arg < arguments.length; i++ )
        if ( args[i] === undefined )
          args[i] = arguments[arg++];
      return fn.apply(this, args);
    };
  };

定义这样的回调:

callback = function(item, value) { console.log(item + value) }.partial(undefined, "myValue")

现在,当您致电callback('myItem')时,它会正确显示“myItem myValue”