在CoffeeScript中,我可以像使用JavaScript一样实例化声明上方的类吗?
这个JavaScript工作得很好,因为JS运行时在运行语句之前会解析所有声明在CoffeeScript中,我可以像使用JavaScript一样实例化声明上方的类吗?,javascript,class,coffeescript,declaration,instantiation,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 se
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'
不
这就是coffeescript的工作原理,正如前面删除的答案中所提到的。所有coffeescript函数都是在传输的javascript中使用var
声明的,因此它们不受函数提升的约束,这使得在javascript中无序使用构造函数成为可能。我支持Jeremy Ashkenas的观点,该函数是javascript的“坏部分”之一,完全没有必要(参见python、ruby等,其中引用文件后面声明的名称是错误的)。用你自己的话来说,是的“你在使用类之前必须声明它们”,但我不同意这是困难的。很好。没有。
这就是coffeescript的工作原理,正如前面删除的答案中所提到的。所有coffeescript函数都是在传输的javascript中使用
var
声明的,因此它们不受函数提升的约束,这使得在javascript中无序使用构造函数成为可能。我支持Jeremy Ashkenas的观点,该函数是javascript的“坏部分”之一,完全没有必要(参见python、ruby等,其中引用文件后面声明的名称是错误的)。用你自己的话来说,是的“你在使用类之前必须声明它们”,但我不同意这是困难的。没关系。除了@PeterLyons所说的之外,让我来告诉你为什么你要做坏事:
问题是,不同浏览器之间的提升行为不同;例如:
在某些浏览器(如Firefox)中,declaration()将返回“first”,而在其他浏览器(如Chrome)中,它将返回“second”,尽管看起来else语句从未运行过
除了@PeterLyons所说的之外,让我向您介绍一下解释您为什么要做坏事的: 问题是,不同浏览器之间的提升行为不同;例如: 在某些浏览器(如Firefox)中,declaration()将返回“first”,而在其他浏览器(如Chrome)中,它将返回“second”,尽管看起来else语句从未运行过
顺便说一句,这叫吊装顺便说一句,这叫吊装
if (true) {
function declaration() {
return "first";
}
} else {
function declaration() {
return "second";
}
}
declaration();