Coffeescript将函数包装在一个函数中

时间:2011-08-16 17:29:08

标签: javascript coffeescript

由于某些原因,coffeescript编译器在编译时将所有.coffee文件包装在函数中。例如,如果我有test.coffee:

class TestClass
    constructor: (@value) ->

    printValue: () ->
        alert(@value)

printAValue = () -> 
    test = new TestClass()
    test.printValue()

然后我得到test.js:

(function() {
  var TestClass, printAValue;
  TestClass = (function() {
    function TestClass(value) {
      this.value = value;
    }
    TestClass.prototype.printValue = function() {
      return alert(this.value);
    };
    return TestClass;
  })();
  printAValue = function() {
    var test;
    test = new TestClass();
    return test.printValue();
  };
}).call(this);

我的简单html文件不能用于此:

<html>
    <head>
        <script src="test.js"></script>
    </head>
    <body onload="printAValue()">
    </body>
</html>

之前我没有使用过很多JS,我不会怀疑咖啡编译器,但它应该如何工作?如何

2 个答案:

答案 0 :(得分:9)

有关在文件/模块之间共享jS代码的信息,请参阅my answer here。另外,FYI包装函数的设计是为了防止无意的全局变量。您可以通过将--bare传递给咖啡编译器命令行工具来禁用它,但这是一个有充分理由的最佳实践。

答案 1 :(得分:7)

永远不要在HTML中添加事件侦听器。将它们添加到JavaScript中,最好与您定义事件处理程序的范围相同。

printAValue = () -> 
    test = new TestClass()
    test.printValue()

document.body.addEventListener('load', printAValue, false)

如果您绝对需要将某些内容导出到全局范围,请导出到窗口对象:

window.printAValue = () -> 
    test = new TestClass()
    test.printValue()