3

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

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

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

class MyClass
  acc: (name) ->

当使用http://js2coffee.org转换回 CoffeScript 时,建议的答案代码呈现为不同的代码,但它仍然不起作用。想知道 CoffeScript 是否有提示将 MyClass 从本地范围弹出到外部范围。

4

2 回答 2

5

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

(function() {

    var myClass = ...

    window.myClass = myClass;

}).call( this );

更新:您似乎想要在 CoffeeScript 中使用它。干得好:

(->

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

    myClass
  )()

  window.myClass = myClass

).call this

JSBin 演示

于 2012-11-17T21:44:01.997 回答
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);

唯一的区别是您明确地说MyClasswindow 的属性将等于函数的执行结果。

您的 CoffeeScript 可能类似于:

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

    MyClass
  )()
).call this
于 2012-11-17T21:43:24.107 回答