controller.js.coffee中的函数

我在使用CoffeeScript创建函数时遇到了一些麻烦,我想我错过了一些东西。 对于我的用户控制器,我想为注册表单创建客户端validation。 我想我已经错过了这一切如何运作的基本原则。

 {:onsubmit => "return validate_signup_form();"} do |f| %> 

CoffeeScript( assets / users.js.coffee ):

 validate_signup_form = () -> alert "Hi" return false 

预期产量:

 var validate_signup_form; validate_signup_form = function() { alert("Hi"); return false; }; validate_signup_form(); 

实际输出:

 (function() { var validate_signup_form; validate_signup_form = function() { alert("Hi"); return false; }; }).call(this); 

实际上一切都按照预期的方式运作。 正如您在此处所读到的,Coffeescript将您的代码包装在一个匿名函数中,以防止污染全局命名空间。 如果你只是看一下这些例子,你可能会错过这个,但文档明确指出:

虽然为了清楚起见在本文档中进行了抑制,但所有CoffeeScript输出都包含在一个匿名函数中:(function(){…})(); 这个安全包装器与var关键字的自动生成相结合,使得非常难以意外地污染全局命名空间。

为了访问在此人工范围内声明的对象,变量或方法,您需要在全局范围内明确提供它,例如:

 window.validate_signup_form = validate_signup_form 

如果您提到我肯定会使用事件来触发该方法。

顺便说一句:你的方法声明中不需要空括号foo =->工作得很好。

polarblau的回答是完全正确的。 也可以看看:

  • 摆脱CoffeeScript的封装包装
  • 如何在Rails 3.1 for CoffeeScript中使用选项“–bare”?

闭包装是一种保持文件模块化的好方法(因为它们应该是这样),所以我强烈建议不要删除它。 请注意,在模块的外部范围中, this / @将是window ,因此您只需添加单个字符即可使代码按预期工作:

 @validate_signup_form = -> alert "Hi" false 

您是否更喜欢使用@window.取决于您自己window. 用于定义全局变量,但@ style还有另一个优点:如果在Node.js应用程序中重用代码,那么它仍然可以工作。 这些对象将附加到exports而不是window