这个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'
答案 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语句永远不会运行。