Javascript:ReferenceError:未定义MyClass

时间:2012-11-17 21:39:35

标签: javascript coffeescript

这是非常基本的。我尝试实例化嵌入的外部.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>

如果我尝试在控制台上实例化该类,但我看到了ReferenceError: MyClass is not defined

var myVar
myVar = new MyClass
> ReferenceError: MyClass is not defined

如果我尝试直接从控制台调用MyClass,我会收到同样的错误

> ReferenceError: MyClass is not defined

我确信我在这里遗漏了一些可怕的东西,但我能弄清楚是什么。

已更新:要创建编码的javascript我正在使用CoffeScript,代码就是这样。

class MyClass
  acc: (name) ->

建议的答案代码在使用http://js2coffee.org渲染转换回CoffeScript时转换为不同的代码,但仍然无效。想知道如果有一个CoffeScript提示将MyClass从本地范围弹出到外部范围。

2 个答案:

答案 0 :(得分:5)

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

(function() {

    var myClass = ...

    window.myClass = myClass;

}).call( this );

更新:您似乎想在CoffeeScript中使用它。你走了:

(->

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

    myClass
  )()

  window.myClass = myClass

).call this

<强> JSBin Demo

答案 1 :(得分:2)

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);

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

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

(function() {

  window.MyClass = (function() {

    function MyClass() {}

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

    return MyClass;

  })();

}).call(this);

唯一的区别是你明确地说窗口的属性MyClass将等于函数执行的结果。

你的CoffeeScript可能类似于:

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

    MyClass
  )()
).call this