我创建了一个coffeescript函数square=(x)->alert x*x
它被编译成这个javascript
(function() {
var square;
square = function(x) {
return alert(x * x);
};
}).call(this);
因此,如果我编写此代码<button onclick="square(5)">
,编译器会说square()
未定义。怎么了?
答案 0 :(得分:3)
您的函数square必须是全局定义的函数才能从您定义的HTML中调用它。但是这段代码:
(function() {
var square;
square = function(x) {
return alert(x * x);
};
}).call(this);
不全局定义函数,因此无法找到符号。实际上,功能方块仅在您的IIFE中定义,并且在其他任何地方都不可用。如果您希望全局可用,您也可以将上面的块更改为:
window.square = function(x) {
return alert(x * x);
}
或者,你可以这样做:
(function() {
this.square = function(x) {
return alert(x * x);
};
}).call(this);
或者,显然在CoffeeScript中,@符号是this.
的简写,所以你可以使用它:
(function() {
@square = function(x) {
return alert(x * x);
};
}).call(this);
甚至只是这个:
@square = function(x) {
return alert(x * x);
};
有关详细信息,请参阅此其他答案:How do I define global variables in CoffeeScript?
更好的方法是不使用这种调用方法。如果您使用事件监听器,那么您根本不必使该功能全局化。