Javascript 是我,还是约翰·雷斯格;部分应用程序上的流行博客帖子不起作用?

Javascript 是我,还是约翰·雷斯格;部分应用程序上的流行博客帖子不起作用?,javascript,partial-application,Javascript,Partial Application,John Resig有一篇关于部分应用程序的流行博文:很多地方都提到过,而且 但是,博客文章中的代码不起作用。这是: 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 &&

John Resig有一篇关于部分应用程序的流行博文:很多地方都提到过,而且

但是,博客文章中的代码不起作用。这是:

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

var delay = setTimeout.partial(undefined, 10);

delay(function(){
  alert( "A call to this function will be temporarily delayed." );
});
请注意,第二条消息不会出现,而第一条消息会出现。当然,如果你重做延迟函数,它是有效的,但为什么你每次使用它时都要重做部分应用的函数呢

现在,考虑到这篇博文是谷歌针对“部分应用程序javascript”的第二个结果,而且似乎相当受欢迎,我怀疑这篇博文是否完全被打破了。另一方面,大量的代码示例和流行的Prototype.js库函数都是我所期望的——可重用的部分应用程序。他的咖喱功能在页面上方稍高一点,完全按照我的预期工作。因此:

  • John Resig的代码不正确吗
  • 如果不是,为什么他的代码每次你想使用它时都会强迫你重新生成部分应用的函数
John Resig的代码不正确吗

对。即使你怀疑它,它只是完全破碎了

undefined
的部分应用程序只能工作一次,因为他正在修改共享的
args
数组。没有任何未定义的
的部分应用程序根本不起作用

对于生成只调用一次的回调或类似调用,它仍然可能有帮助,但这不是很实用

固定的:

Function.prototype.partial = function() {
  var fn = this, args = arguments;
  return function() { 
    var filledArgs = Array.prototype.slice.call(args);
    for (var i=0, arg=0; arg < arguments.length; i++)
      if (filledArgs[i] === undefined)
        filledArgs[i] = arguments[arg++];
    return fn.apply(this, filledArgs);
  };
};
Function.prototype.partial=Function(){
var fn=this,args=arguments;
返回函数(){
var filledArgs=Array.prototype.slice.call(args);
for(变量i=0,arg=0;arg
请注意,与将
filledArgs
的长度限制为部分给定参数(包括
undefined
s)的数量不同,这现在可以接受任意多个附加参数,并以类似于的方式将其追加



哦,在我们讨论这个问题时,约翰·雷斯格(John Resig)也把这个词弄错了,他也在用他的
.curry
方法(维基百科在2008年没有那么准确)。

太好了,谢谢!我编写了一个函数来实现函数的预期功能,但您的函数没有那么冗长。
Function.prototype.partial = function() {
  var fn = this, args = arguments;
  return function() { 
    var filledArgs = Array.prototype.slice.call(args);
    for (var i=0, arg=0; arg < arguments.length; i++)
      if (filledArgs[i] === undefined)
        filledArgs[i] = arguments[arg++];
    return fn.apply(this, filledArgs);
  };
};