是我,还是John Resig关于部分应用程序的热门博客文章不起作用?

Owe*_*eeg 8 javascript partial-application

John Resig有一篇关于部分应用的热门博客文章:http://ejohn.org/blog/partial-functions-in-javascript/它在很多地方都有提及,并且有

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

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." );
});
Run Code Online (Sandbox Code Playgroud)

现在,如果您尝试在控制台中运行它,它将正常工作.但是,如果您尝试再次使用延迟功能,它将无法正常工作.运行第一个段后,尝试在控制台中运行此命令:

delay(function(){
  alert( "This is a test" );
});
Run Code Online (Sandbox Code Playgroud)

请注意,第二条消息不会出现 - 第一条消息会出现.当然,如果你重新设置延迟功能,它可以工作,但是为什么你每次使用它时都想要重新制作部分应用的功能呢?

现在,鉴于此博客文章是"部分应用程序javascript"的第二个Google结果,并且似乎相当受欢迎,我怀疑它完全被破坏了.另一方面,大量的代码示例和流行的Prototype.js库以我期望的方式运行 - 可重用的部分应用程序.他的currying功能,略高于页面,完全符合我的预期.从而:

  • John Resig的代码不正确吗?
  • 如果不是,为什么他的代码会强制您每次想要使用它时重新制作部分应用的功能?

Ber*_*rgi 6

John Resig的代码不正确吗?

是.即使你怀疑它,它完全被打破了.

部分应用程序undefined不能多次工作,因为他正在修改共享args数组.并且没有任何部分应用undefined根本不起作用.

它仍然可能有助于生成仅被调用一次的回调等,但这不是很有用.

固定:

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);
  };
};
Run Code Online (Sandbox Code Playgroud)

请注意,与限制filledArgs部分给定参数(包括undefineds)的数量的长度不同,这现在确实接受任意多个附加参数,并且只是以类似的方式附加它们bind.


哦,虽然我们在这,约翰Resig的也得到了长期讨好错了,他是做局部应用他的.curry方法,以及(维基百科是不是在2008年准确).