Javascript currying:为什么一个闭包范围示例有效,但另一个没有?

时间:2014-11-10 06:24:30

标签: javascript closures currying partial-application

我正在尝试理解Vimeo上的视频“理解函数Currying”(http://vimeo.com/41238143但是没有必要查看它以便理解这个问题。)

我理解的例子

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

enter image description here

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

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

我不明白的例子

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

(对不起,我切断了说“var ...”的行,只要相信它就在那里, createFn getFn 等都是被宣布为长“var”行的一部分。)

enter image description here

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

enter image description here

以下是我的问题:为什么 className createFn 的范围内?在我看来,它不再是 forClass onSuccess 的范围在创建范围内。

这与...有关吗?

  • 回调示例中的函数永远不会被赋值为create function context中的变量,只能调用?
  • 使用promises的回调示例?

1 个答案:

答案 0 :(得分: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 Full Source & Live CodePen Demo