在Github上查看CoffeeScript的源代码时,我注意到大多数(如果不是全部)模块定义如下:
(function() {
...
}).call(this);
Run Code Online (Sandbox Code Playgroud)
这种模式看起来像是将整个模块包装在匿名函数中并调用自身.
这种方法的优点和缺点是什么?还有其他方法可以实现相同的目标吗?
我的应用程序中有一些视图,它引用了我的application.js文件,其中包含我在整个应用程序中使用的函数.
在使用3.1的边缘版本之后,我刚刚安装了Rails 3.1版本候选版本.直到我安装RC我没有任何问题,但现在我收到此错误:
ReferenceError:找不到变量:indicator_tag
indicator_tag是我在application.js中定义的函数.我在javascript文件中注意到的唯一区别是现在我的所有函数都包含在:
(function() { ... }).call(this);
Run Code Online (Sandbox Code Playgroud)
我理解这是针对变量范围的吗?但它可能阻止我的页面使用这些变量吗?在有人要求之前,我确保我的include标签中的javascript路径是正确的.
刚刚安装了rails 3.1 rc1,我试图用新资产管道来管理javascript的最佳方法默认情况下,所有coffeescript都被编译成一个application.js文件,这是一件好事.
每个单独的咖啡脚本文件都附加到js文件并包装在一个匿名函数中,该函数通过调用方法执行.常见的场景是使用一些jquery将各种表单转换为ajax表单,更新UI等...
这些脚本中的许多都是特定于控制器或动作的,我试图用"常规"方式来处理这个,因为所有内容都包含在一个匿名函数中,我如何只执行特定控制器/动作的代码,默认情况下,正在执行所有匿名函数
我确实玩了一些hacks,我将控制器和动作名称加载到js变量中,然后在coffeescript中检查那些有条件地运行代码,我不是很喜欢
我最初的想法是每个咖啡文件都包含一个js命名空间/对象,我会从视图中调用特定的那些,使用default_bare = true配置来调用它
请参阅如何在Rails 3.1 for CoffeeScript中使用选项"--bare"?
编辑
再看一些:看起来这可能是正确的方法 - 使用Rails 3.1和Coffeescript"找不到变量"错误
用coffeescript和Rails 3.1.0.rc4玩一点.有这个代码:
yourMom = (location) ->
console.log location
yourMom "wuz hur"
Run Code Online (Sandbox Code Playgroud)
页面加载时,会正确输出"wuz hur".但是当我试着打电话的时候
yourMom("wuz hur")
Run Code Online (Sandbox Code Playgroud)
从chrome js控制台(我有时会测试普通的JS函数),我得到一个"ReferenceError:yourMom未定义"
coffeescript生成的函数是否以这种方式提供?
所以我有两个控制器,hotels和videos.我希望hotels.js.coffee能够访问创建的函数,videos.js.coffee但我得到一个"未定义"错误.
我是CoffeeScript的新手,所以任何线索都会受到赞赏.
我在使用CoffeeScript创建函数时遇到了一些麻烦,我想我错过了一些东西.对于我的用户控制器,我想为注册表单创建客户端验证.我想我已经错过了这一切如何运作的基本原则.
<%= form_for @user, :html => {:onsubmit => "return validate_signup_form();"} do |f| %>
Run Code Online (Sandbox Code Playgroud)
CoffeeScript(assets/users.js.coffee):
validate_signup_form = () ->
alert "Hi"
return false
Run Code Online (Sandbox Code Playgroud)
预期产量:
var validate_signup_form;
validate_signup_form = function() {
alert("Hi");
return false;
};
validate_signup_form();
Run Code Online (Sandbox Code Playgroud)
实际输出:
(function() {
var validate_signup_form;
validate_signup_form = function() {
alert("Hi");
return false;
};
}).call(this);
Run Code Online (Sandbox Code Playgroud) 使用Rails 3.1(rc5),我注意到我包含rails(或sprockets)的任何coffeescript文件正在添加初始化javascript的顶部和底部.换句话说,一个空白的.js.coffee文件输出如下:
(function() {
}).call(this);
Run Code Online (Sandbox Code Playgroud)
这很烦人,因为它搞砸了我的javascript范围(除非我真的不知道我在做什么).我通常将我的所有javascript类分成单独的文件,我相信将这些函数代码包装成我的类只会使它们彼此超出范围.或者,至少,我似乎无法访问它们,因为我不断得到未定义的错误.
有没有办法覆盖这个?似乎sprockets中的这个文件与添加这段代码有关:https: //github.com/sstephenson/sprockets/blob/master/lib/sprockets/jst_processor.rb
我知道将函数中的所有内容包装起来似乎是一种额外的便利,因为在加载DOM之前没有任何东西可以运行,但据我所知,它只是弄乱了我的范围.
我不知道所有coffeescript编译器是否将其脚本包装在匿名函数中,但这就是我看到Rails所做的.如何禁用此封装?
我想在一个coffeescript文件中放入几个初始化函数,然后从页面<script>标签中调用其中一个(这样每个页面调用一个不同的初始化程序).如果封装了初始化函数,则不能这样做.
Coffeescript初始化函数:
initializerA = -> console.log 'foo'
initializerB = -> console.log 'bar'
Run Code Online (Sandbox Code Playgroud)
页面代码:
<script>$(document).ready(initializerA)</script>
Run Code Online (Sandbox Code Playgroud)
系统:coffee-rails 3.2.1,Rails 3.2.3,Ruby 1.9.3