簡體   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