Javascript:ReferenceError:MyClass未定义

Javascript:ReferenceError:MyClass未定义,javascript,coffeescript,Javascript,Coffeescript,这是非常基本的。我尝试实例化一个在嵌入的外部.js文件中定义的类。js的代码就是这样 (function() { var MyClass; MyClass = (function() { function MyClass() {} MyClass.prototype.name = function(name) {}; return MyClass; })(); }).call(this); HTML就是这样 <!DOCTYPE html&g

这是非常基本的。我尝试实例化一个在嵌入的外部.js文件中定义的类。js的代码就是这样

(function() {
  var MyClass;

  MyClass = (function() {

    function MyClass() {}

    MyClass.prototype.name = function(name) {};

    return MyClass;

  })();

}).call(this);
HTML就是这样

<!DOCTYPE html>
<html>

  <head>
    <title>Sample Page</title>
    <script src="file.js" type="text/javascript"></script>
  </head>

  <body>

  </body>
</html>
如果我试图直接从控制台调用
MyClass
,我会得到相同的错误

> ReferenceError: MyClass is not defined
我肯定我错过了一些非常明显的东西,但我能弄清楚是什么

更新:要创建我正在使用的CoffeScript编码的javascript,代码如下所示

class MyClass
  acc: (name) ->

当使用render将代码转换回CoffeScript时,建议的答案是代码,但它仍然不起作用。不知道CoffeScript上是否有将MyClass从本地作用域弹出到外部作用域的提示。

MyClass
定义在自调用函数的本地作用域中。您可以尝试在自调用函数之外初始化
MyClass

var MyClass;
(function() {

  MyClass = (function() {

    function MyClass() {}

    MyClass.prototype.name = function(name) {};

    return MyClass;

  })();

}).call(this);
你可以做的另一件事是:

(function() {
  this.MyClass = (function() {

    function MyClass() {}

    MyClass.prototype.name = function(name) {};

    return MyClass;

  })();

}).call(window);
在上面的代码中,您只需使用
窗口
上下文调用匿名函数,并将值设置为
MyClass
窗口的属性(这使
MyClass
全局)

另一个解决方案(我认为更不清楚)是:

唯一的区别是,您明确表示window的属性
MyClass
将等于函数执行的结果

你的咖啡脚本可能是这样的:

MyClass = undefined
(->
  MyClass = (->
    MyClass = ->
    MyClass::name = (name) ->

    MyClass
  )()
).call this

我的类是在闭包中定义的。相反,您要做的是通过将其设置为窗口对象将其“弹出”到外部范围:

(function() {

    var myClass = ...

    window.myClass = myClass;

}).call( this );
更新:似乎您希望在CoffeeScript中使用它。给你:

(->

  myClass = (->
    myClass = ->
    myClass::name = (name) ->

    myClass
  )()

  window.myClass = myClass

).call this

@Martin那么你是说你想要同样的东西,只是在Coffescript中?你提出的解决方案在转换为Coffescript时不知怎么坏了。想知道CoffeScript上是否有一个特定的方法用于此。除此之外,它仍然不起作用(最终呈现出不同的代码)。@Martin我不熟悉CoffeeScript,我不知道。虽然我使用了你引用的网站并输入了代码。它似乎没有做错什么。看这里--我已经发布了一个咖啡脚本示例
(function() {

    var myClass = ...

    window.myClass = myClass;

}).call( this );
(->

  myClass = (->
    myClass = ->
    myClass::name = (name) ->

    myClass
  )()

  window.myClass = myClass

).call this