Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在CoffeeScript中,我可以像使用JavaScript一样实例化声明上方的类吗?_Javascript_Class_Coffeescript_Declaration_Instantiation - Fatal编程技术网

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

在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

这个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'
不 这就是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();