Аргумент coffeescript по умолчанию, если он не передан, не назначен внешней переменной с тем же именем, что и arg - PullRequest
2 голосов
/ 20 августа 2011

Кто-нибудь может объяснить, почему это не сработает?Я просто запускаю это на странице CoffeeScript «Попробуйте Coffeescript сейчас», и моя консоль Chrome регистрирует «nope», как вы увидите ниже

x = true
foo = (x = x) ->
  console.log if x then "works" else "nope"
foo() # "nope"

Если бы я изменил x = true на y= true и (x = x) - (x = y) в определении аргумента

Спасибо, миллион!

Ответы [ 2 ]

10 голосов
/ 20 августа 2011

Просмотр компилируемой функции делает проблему очевидной:

  foo = function(x) {
    if (x == null) x = x;
    return console.log(x ? "works" : "nope");
  };

Как видите, если аргумент x равен нулю, ему присваивается x. Так что все равно ноль.

Итак, переименование переменной x в y устраняет проблему:

y = true
foo = (x = y) ->
  console.log if x then "works" else "nope"
foo() # "nope"
0 голосов
/ 20 августа 2011

Арно ответ правильный. Этот подход также работает:

x = true
do foo = (x) ->
  console.log if x then "works" else "nope"

Синтаксис do избавляет вас от необходимости переименовывать переменные при записи их в функцию.

Редактировать: На самом деле этот код дает "nope" в текущей версии CoffeeScript, хотя do (x) -> даст вам "works". Смотрите мой комментарий ниже.

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