Каррирование Javascript: почему один пример области закрытия работает, а другой нет?

Я пытаюсь понять видео «Понимание каррирования функций» на Vimeo ( http://vimeo.com/41238143 но не обязательно его просматривать, чтобы понять этот вопрос).

Пример я понимаю

В начале видео Нам говорят, что есть проблема с этим кодом:

введите здесь описание изображения

Проблема с этим кодом: использование обратного вызова в строках 11 и 14 не будет работать, потому что оно выходит за рамки — onSuccess существует в области buildCRUD, а не в области создать область. (Я назову это «пример обратного вызова».)

Хорошо, это имеет смысл для меня. Решения рассматриваются в том числе с использованием одной переменной класса (я знаю, что эта терминология отключена, потому что в javascript нет классов, но вы понимаете, что я имею в виду).

Пример я не понимаю

Вот где я смущен. В конце видео нам говорят, что этот код для другой части функции будет работать. (Обратите внимание на переменный параметр "className"; я буду называть его "пример className".)

(Извините, я отрезал строку, в которой говорится "var ...", просто поверьте мне, что она там и createFn, getFn и т. д. объявляются как часть длинной строки «var».)

введите здесь описание изображения

Как видите, реализация этих функций, таких как createFn, действительно использует переменную className, хотя она не передается в функцию в качестве параметра.

введите здесь описание изображения

Вот мой вопрос: почему className находится внутри createFn? Мне кажется, что его больше нет в forClass чем onSuccess в области создания.

Это как-то связано с...

  • тот факт, что функция в примере обратного вызова никогда не назначается как переменная внутри контекста функции создания, а только вызывается?
  • пример обратного вызова с использованием обещаний?

person Ben Wheeler    schedule 10.11.2014    source источник
comment
Пожалуйста, опубликуйте код, который является копируемым и исполняемым. Не скриншоты.   -  person Bergi    schedule 10.11.2014
comment
И размытые при этом. Предположительно есть ссылка, связанная с видео для кода. Получите код, сократите его до того, что относится к вашему вопросу, и опубликуйте его.   -  person T.J. Crowder    schedule 10.11.2014
comment
Мне это кажется ошибкой (или есть второе объявление className, где мы его не видим). Обратите внимание, что onSuccess входит в область действия create, но callback не входит в область действия onSuccess'. Нет, это не имеет ничего общего с обещаниями.   -  person Bergi    schedule 10.11.2014
comment
Raptor - спасибо, хорошая идея, спрошу сейчас. Берги и Т.Дж. Краудер — да, это могло бы улучшить ситуацию, но я не спрашиваю, что мне делать? которые потребуют ответов с большим количеством кода. Я спрашиваю, какой здесь принцип? так что я могу прочитать больше об этом.   -  person Ben Wheeler    schedule 10.11.2014


Ответы (1)


Мои извинения всем. В записи 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

person user2747330    schedule 21.12.2014