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

Is it possible to redefine parts of a javascript function without changing the behaviour?

本文关键字:定义 javascript 函数 新定义 情况下 改变 是否      更新时间:2023-09-26

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

function(item) {};

在我的情况下,我需要包括第二个参数,我目前通过使用"bind"方法解决这个参数。

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

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

function(item, value) {};

然后将其转换为绑定方法,以满足外部库的要求。

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

感谢

您想要使用闭包。这是基本模式,虽然不像乔治建议的那么简单。但就性能而言,没有那么大的成功率(接近最低)。

定义一个函数:

myValueFunction(value, fn){
  return fn;
}

由于您似乎是在说您的插件提供item,而您提供的是value,因此您将myValueFunction(yourvalue, function(item){})设置为插件的回调函数(以您的实际值作为参数)。它将"返回"另一个包含一个参数(项)的值的函数。

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

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

这基本上就是georg的答案(他的方法更通用),但他的方法在性能方面会比直接定义这些函数慢得多,尤其是当你开始添加许多参数时。

您可以从这里使用函数.部分实现:

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')时,它会正确显示"myItemmyValue"