1

这个 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'
4

2 回答 2

4

不。

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

于 2013-06-13T23:36:11.980 回答
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 语句从未运行。

于 2013-06-14T20:16:54.907 回答