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
。