Можно ли перевести CoffeeScript на этот кусок JavaScript? - PullRequest
4 голосов
/ 20 марта 2012
function abc() {
    var a = 1;
    var func = function() {
        var a = 2;
    }
    func();
    alert(a);
}

Обратите внимание на var, в фрагменте кода результат a будет 1, но если пропустить var, результат будет 2, но я обнаружил, что Coffee неможно перевести на это.

Например, следующее:

abc = ->
    a = 1
    func = ->
        a = 2
        return
    func()
    alert(a)
    return

Ответы [ 5 ]

5 голосов
/ 20 марта 2012

Из документов CoffeeScript (выделение добавлено):

Поскольку у вас нет прямого доступа к ключевому слову var, это невозможно скрыть внешнюю переменную специально, вы можете только сослаться к этому.

Есть ли причина, по которой вам нужно затенять a, и вы не можете просто использовать другой идентификатор?

4 голосов
/ 20 марта 2012

Вы можете использовать обратные пометки для выполнения обычного js.

abc = ->
    a = 1
    func = ->
        `var a = 2`
        return
    func()
    alert(a)
    return

Скомпилированная форма

var abc;

abc = function() {
  var a, func;
  a = 1;
  func = function() {
    var a = 2;
  };
  func();
  alert(a);
};
2 голосов
/ 21 марта 2012

CoffeeScript, по замыслу, не позволяет скрывать ранее объявленную переменную.Тем не менее, есть один случай, когда это все еще происходит:

abc = ->
    a = 1
    func = (a) ->
        a = 2
        return
    func()
    alert(a)
    return

Это приведет к 1.Поскольку a является параметром функции, он является локальным для области действия функции.

Кстати, вы можете переписать его как

abc = ->
    a = 1
    do (a) -> a = 2
    alert a
    return

, где do (a) -> a = 2 эквивалентно ((a) -> a = 2)().

1 голос
/ 20 марта 2012

Ну, если вы сделаете это:

abc = ->
    a = 1
    func = ->
        b = 2
        alert(b)
        return
    func()
    alert(a)
    return

Вы получите:

var abc;

abc = function() {
  var a, func;
  a = 1;
  func = function() {
    var b;
    b = 2;
    alert(b);
  };
  func();
  alert(a);
};

Так что просто не используйте одно и то же имя переменной во 2-й области действия метода, и вы всехорошо идти.

0 голосов
/ 20 марта 2012

А как насчет следующего кода?

abc = ->
    a = 1
    func = ->
        @a = 2
        return
    func()
    alert(a)
    return

Я согласен: это не совсем тот же код, но ведет себя как ожидалось ...

Ваш вопрос - просто стилистическая композиция илиу вас есть проблема "реального мира"?

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