0

我正在尝试了解 Vimeo 上的视频“Understanding Function Currying”(http://vimeo.com/41238143,但没有必要为了理解这个问题而查看它)。

我理解的例子

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

在此处输入图像描述

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

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

看不懂的例子

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

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

在此处输入图像描述

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

在此处输入图像描述

这是我的问题:为什么className在createFn的范围内?在我看来,它在forClass范围内并不比onSuccess在 create 范围内更多。

这和这有关系吗...

  • 回调示例中的函数从未在创建函数上下文中被分配为变量,仅被调用?
  • 使用承诺的回调示例?
4

1 回答 1

0

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

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

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 演示

于 2014-12-21T17:58:35.627 回答