由于某些原因,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,我不会怀疑咖啡编译器,但它应该如何工作?如何
答案 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()