繁体   English   中英

Javascript Curry:为什么一个闭包作用域示例有效,而另一个不起作用?

[英]Javascript currying: why does one closure scope example work, but another doesn't?

我正在尝试了解Vimeo上的视频“了解函数的固化”( http://vimeo.com/41238143,但不必为了理解此问题而观看它)。

我明白的例子

在视频的早期,我们被告知此代码存在问题:

在此处输入图片说明

这段代码的问题:在第11行和第14行使用回调将不起作用,因为它超出了范围— onSuccess存在于buildCRUD范围中,而不在create范围中。 (我将其称为“回调示例”。)

好的,这对我来说很有意义。 解决方案被认为包括使用单个类变量(我知道该术语已关闭,因为javascript没有类,但您知道我的意思)。

我不明白的例子

这就是我感到困惑的地方。 在视频末尾,我们被告知该函数另一部分的代码将起作用。 (注意“ className”变量参数;我将其称为“ className示例”。)

(对不起,我切断了说“ var ...”的行,只是相信我,它在那里,并且createFngetFn等都声明为长“ var”行的一部分。)

在此处输入图片说明

如您所见,这些函数的实现(例如createFn)确实使用了className变量,尽管它没有作为参数传递给函数。

在此处输入图片说明

这是我的问题: 为什么classNamecreateFn的范围内? 在我看来, forClass范围内的内容仅比createSuccess范围内的onSuccess多。

这是否与...有关

  • 回调示例中的函数从未在create function上下文内分配为变量的事实,只能调用吗?
  • 使用promises的回调示例?

我向大家道歉。 Vimeo录制可能有一些错误。

为了演示可行的解决方案,我创建了Book CRUD服务的工作版本,以演示AngularJS应用程序中使用的JavaScript部分应用程序。

getFn = function (objectId, callback) {

      // Simulate $http to get book information for
      // specified ID.

      var deferred = $q.defer(),
          book = {
            url : buildRequestURL(objectId),
            title : "Learn to use Javascript Partial Applications"                
            author: "Thomas Burleson"
          },
          notifyFn = onSuccess(callback);


      $timeout(function() {
        notifyFn( book );
        deferred.resolve( book );
      });

      return deferred.promise;
}

@see 完整源代码和实时CodePen演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM