Реализация отложенной функции CoffeeScript - PullRequest
1 голос
/ 08 марта 2011

Я хотел бы что-то подобное в JavaScript

var init = function () {
              // do some stuff once
              var once = true

              // overwrite the function 
              init = function () {
                 console.log(once)
              }

}

CoffeeScript добавляет еще один локальный var init к начальному init, чтобы второй init не перезаписывал первый

var init = function () {
              var init //automatically declared by coffeescript
              // do some stuff once
              var once = true

              // overwrite the function 
              init = function () {
                 console.log(once)
              }

}

Некоторые советы для решений / обходных путей будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 08 марта 2011

( Обновление: Ответ ниже был точным в то время, под CoffeeScript 1.0.1. Это больше не относится к CoffeeScript 1.1.0, который исправил эту проблему.)

Ничего себе, это удивляет меня.CoffeeScript

init = ->
  init = -> console.log once

объявляет как внешний init, так и внутренний init.Это кажется мне более вероятной ошибкой, чем осознанным решением при проектировании языка - компилятор проще оценивает функцию, прежде чем он оценивает внешнее присваивание init =.Я пошел вперед и подал проблему по этому вопросу.

Вот обходной путь:

init = null
init = ->
  init = -> console.log once

Теперь есть только один init, тот, который имеет самый внешнийОбъем.

0 голосов
/ 14 марта 2011

Я полагаю, что это по замыслу.Вы не должны полагаться на неявные глобалы.init является свойством окна / глобального объекта, поэтому просто ссылайтесь на него правильно:

window.init = ->
    var once = true
    window.init = ->
        console.log once
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...