CoffeeScript懒函数实现

时间:2011-03-08 12:54:38

标签: coffeescript lazy-initialization

我想在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 个答案:

答案 0 :(得分:1)

更新>下面的答案在CoffeeScript 1.0.1下是准确的。在CoffeeScript 1.1.0中不再是这种情况,它解决了这个问题。)

哇,这让我很惊讶。 CoffeeScript

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

声明外部init和内部init。这让我更有可能是一个错误而不是有意识的语言设计决策 - 编译器在评估外部init =赋值之前更简单地评估函数。我已经开始了filed an issue

这是一种解决方法:

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

现在只有一个init,一个是最外层的。{/ p>

答案 1 :(得分:0)

我相信这是设计的。你不应该依赖隐式全局变量。 init是窗口/全局对象的属性,因此只需正确引用它:

window.init = ->
    var once = true
    window.init = ->
        console.log once