Coffeescript函数未定义。

4
我创建了一个Coffeescript函数square=(x)->alert x*x
它被编译成以下Javascript代码:

(function() {
  var square;

  square = function(x) {
    return alert(x * x);
  };

}).call(this);

如果我写下这段代码<button onclick="square(5)">,编译器会提示square()未定义。出了什么问题?


从你的 pastebin 看来,square 被保留在闭包中,因此永远不会进入全局命名空间。 - Paul S.
1个回答

5
您的函数square必须是全局定义的,才能像您定义的那样从HTML中调用它。但是这段代码:
(function() {
  var square;

  square = function(x) {
    return alert(x * x);
  };

}).call(this);

该函数未被全局定义,因此无法找到该符号。实际上,函数square仅在您的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);
};

更多信息请参见此答案:如何在CoffeeScript中定义全局变量?


更好的方法是不使用这种调用方式。如果使用事件监听器,那么根本不需要将函数设为全局。


但是我在全局编写了一个CoffeeScript函数,它却奇怪地编译成了匿名函数。出了什么问题? - user2513522
@user2513522 - 抱歉,我不太了解Coffeescript,但我已经修改了我的建议,在我的答案中强制它成为全局的。 - jfriend00
@user2513522 - 添加了其他几个 CoffeeScript 选项。 - jfriend00
决定使用以下命令编译Coffeescript:coffee -b --compile somefile.coffee whatever.js。我第一次在stackoverflow上写问题,惊讶于得到如此快速的回答。谢谢你,对我的英语不好表示抱歉。 - user2513522
1
@user2513522 - 由于您是StackOverflow上的新用户,您是否知道如果有人帮助您找到答案,您可以通过点击其答案左侧的绿色复选标记将其答案标记为被接受的答案。这将奖励他们一些声望点数以表彰他们对您的帮助,并为您遵循所需程序赚取一些声望点数。声望点数将使您在该网站上获得特权。 - jfriend00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接