在CoffeeScript中,我可以像使用JavaScript一样在声明之上实例化一个类吗?

时间:2013-06-13 20:16:47

标签: javascript class coffeescript declaration instantiation

这个JavaScript非常有用,因为JS运行时会在运行语句之前解析声明的所有内容。

try {
    function Test() {
        this.speak = function() { alert('From Test!') }
    }
    test = new Test
    test.speak()
} catch (error) {
    alert(error);
}

try {
    secondtest = new SecondTest
    secondtest.speak()
    function SecondTest() {
        this.speak = function() { alert('From SecondTest!') }
    }
} catch (error) {
    alert(error)
}
// Alert: 'From Test!'
// Alert: 'From SecondTest!'

但是,当我在其声明上面创建一个类的实例时,相应的CoffeeScript不起作用:

try 
    class Test
        speak: -> alert 'From Test!'
    test = new Test
    test.speak()
catch error
    alert error

try
    secondtest = new SecondTest
    secondtest.speak()
    class SecondTest
        speak: -> alert 'From SecondTest!'
catch error
    alert error
// Alert: 'From Test!'
// Alert: 'TypeError: undefined is not a function'

2 个答案:

答案 0 :(得分:4)

没有

这正是coffeescript的工作方式,正如之前删除的答案中提到的那样。所有coffeescript函数都是在转换后的javascript中使用var声明的,因此它们不受函数提升的影响,这使得javascript中的构造函数的无序使用成为可能。我和Jeremy Ashkenas在这里,函数提升构成了javascript的“坏部分”之一,并且完全没有必要(参见python,ruby等,其中引用名称在文件的下方引用是错误的)。要使用你自己的话,是的“你必须在使用它们之前声明类”,但我不同意这很难。没关系。

答案 1 :(得分:2)

除了@PeterLyons所说的内容之外,让我向您推荐The Little Book on CoffeeScript,它解释了您为什么要做坏事:

  问题是,浏览器之间的提升行为有所不同;例如:

if (true) {
  function declaration() {
    return "first";
  }
} else {
  function declaration() {
    return "second";
  }
}
declaration();
  

在某些浏览器(例如Firefox)中,declaration()将返回“first”,而在其他浏览器(如Chrome)中,它将返回“second”,即使看起来else语句永远不会运行。