Как избежать того, чтобы переменные метода CoffeeScript были обернуты в объектные литералы? - PullRequest
1 голос
/ 21 февраля 2012

CoffeeScript оборачивает переменные, объявленные внутри методов, в литерал объекта.

Итак, это:

@Templates =
    get: (templateName) ->
        result: ''              # DECLARED HERE
        $.ajax(
            'Views/Templates/' + templateName + '.html',
            type: 'GET'
            dataType: 'html'
            success: (data) ->
                result = data   # ASSIGNED HERE
            async: false
        )
        return result           # RETURNED HERE

Становится так:

(function() {

  this.Templates = {
    get: function(templateName) {
      ({
        result: ''                  //DECLARED IN AN OBJECT LITERAL - I DON'T WANT THIS
      });
      $.ajax('Views/Templates/' + templateName + '.html', {
        type: 'GET',
        dataType: 'html',
        success: function(data) {
          var result;               //DECLARED LOCAL TO THE CALLBACK - I DON'T WANT THIS
          return result = data;
        },
        async: false
      });
      return result;                //RETURNED HERE - UNASSIGNED
    }
  };

}).call(this);

Но то, что мне нужно, и это работает для меня, это:

(function() {

  this.Templates = {
    get: function(templateName) {
      var result = ''               //DECLARED HERE
      $.ajax('Views/Templates/' + templateName + '.html', {
        type: 'GET',
        dataType: 'html',
        success: function(data) {
          return result = data;     //ASSIGNED HERE
        },
        async: false
      });
      return result;                //RETURNED HERE
    }
  };

}).call(this);

Что я делаю не так? Как я могу это исправить?

Ответы [ 3 ]

4 голосов
/ 21 февраля 2012

То, что вы назвали замыканием, не является замыканием (замыкания в JavaScript всегда являются функциями). Это литерал объекта, заключенный в скобки.

Я не совсем знаком с CoffeeScript, но если вы хотите, чтобы result была локальной переменной в функции get, я думаю, вы хотите изменить

result: ''

до

result = ''

Первый - это формат инициализатора объекта (следовательно, он переводится в литерал объекта), второй - присвоение переменной. Похоже, что он описан на сайте CoffeeScript в разделе лексическая область видимости .

2 голосов
/ 21 февраля 2012

По result: '' вы объявляете свойство объекта.Вам нужно было объявить локальную переменную result = '':

get: (templateName) ->
    result = ''              # DECLARED HERE
    $.ajax(
        'Views/Templates/' + templateName + '.html',
        type: 'GET'
        dataType: 'html'
        success: (data) ->
            result = data   # ASSIGNED HERE
        async: false
    )
    return result           # RETURNED HERE
2 голосов
/ 21 февраля 2012

Почему вы используете :? Он не заключен в замыкание, вы просто определяете выражение анонимного объекта.

Просто сделайте это:

result = ''

Тем не менее, почему вы делаете синхронный GET? Это очень неодобрительно и сделает ваш сайт менее адаптивным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...