【问题标题】:Is it me, or does John Resig's popular blog post on partial application not work?是我,还是 John Resig 关于部分应用的热门博文不起作用?
【发布时间】:2014-04-08 23:03:00
【问题描述】:

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

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

delay(function(){
  alert( "This is a test" );
});

请注意,第二条消息不会出现 - 第一条消息会出现。当然,如果你重新制作延迟函数,它就可以工作,但你到底为什么要在每次使用它时重新制作你的部分应用函数呢?

现在,鉴于这篇博文是“部分应用程序 javascript”的第二个谷歌搜索结果,而且似乎相当受欢迎,我怀疑它完全被破坏了。另一方面,大量的代码示例和流行的 Prototype.js 库函数以我期望的方式 - 可重用的部分应用程序。他的柯里化功能,在页面稍高的地方,完全符合我的预期。因此:

  • John Resig 的代码不正确吗?
  • 如果不是,为什么他的代码每次要使用时都强制你重新制作部分应用的函数?

【问题讨论】:

    标签: javascript partial-application


    【解决方案1】:

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

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


    哦,当我们这样做的时候,John Resig 也把 currying 这个词弄错了,他也在用他的 .curry 方法做 partial application(维基百科在 2008 年并不是那么准确)。

    【讨论】:

    • 太好了,谢谢!我写了一个函数来做它打算做的事情,但你的不那么冗长。
    猜你喜欢
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多