当我使用最新的(1.0)咖啡脚本时,一个简单的javascript输出看起来像这样(默认情况下):
(function() {
var a;
a = 1;
}).call(this);
Run Code Online (Sandbox Code Playgroud)
是什么.CALL(本)做,哪些是添加它的原因是什么?
在github上查看代码时,我发现了以下内容:
(function() {
}).call(this);
Run Code Online (Sandbox Code Playgroud)
这显然是一个自我调用的匿名函数.但为什么这样写呢?我习惯于看到规范的变体(function() {})().
使用.call(this)自动调用匿名函数有什么特别的优势吗?
编辑:看起来某些commonjs环境this在模块的顶层设置为非全局值.哪些,以及它们this可能想要保留的内容是什么?
如何省略将变量隐藏在全局范围内的自动闭包?
(function() {
// my compiled code
}).call(this);
Run Code Online (Sandbox Code Playgroud)
只是玩弄CoffeeScript + SproutCore,当然,我更愿意保留原样:在这种情况下,没有必要保护任何东西不被覆盖.
我知道我可以使用@或this.在声明,但这不是太优雅.
有人知道如何在Rails 3.1中使用此选项?现在CoffeScript .call(this)在每个文件上放置一个函数,但我想删除它.
编辑:" 无法找到变量"错误与Rails 3.1和Coffeescript "和" 模式为CoffeeScript模块 "有我想要的.我将改变我的全局变量以使用@global范围.
所以在app/assets/javascript/faye.js.coffee.erb我有以下内容:
$('#room_tag').bind('blur', () ->
alert('Hey!')
)
Run Code Online (Sandbox Code Playgroud)
其中的所有其他代码如:sendmessage('room', 'message')工作得很好.我可以复制并粘贴从上面的块生成的代码并将其粘贴到Chrome中,它可以正常工作.我认为这是因为,无论是rails还是coffeescript?,无论是其中之一,都将整个文件包装在:
(function() {
// your generated code here
}).call(this);
Run Code Online (Sandbox Code Playgroud)
还有可能我有办法访问那里定义的方法吗?是否可以在那里定义一个方法而不将其分配给变量?
在Javascript污染全局命名空间通常被认为是一件坏事.这就是为什么Coffeescript将所有Javascript (function() {}).call(this);包装在一个包装器中.
但是,我已经开始为我的Coffeescript代码编写QUnit测试,而QUnit抱怨它无法找到我的函数.
1. Died on test #1: getGoodNamePart is not defined
getGoodNamePart is not defined at Object.<anonymous> (file:///Users/kevin/Documents/docs/code/chrome/tests.js:2:10) at Object.run
Run Code Online (Sandbox Code Playgroud)
我想在不污染全局命名空间的情况下测试变量.这样做的好方法是什么?
这是我要测试的生成的Javascript:
(function() {
getGoodNamePart = function(str) {
if (str.charAt(0) === '"') {
str.replace(/" <[^>]+>$"/g, "");
str.replace(/"/g, "");
return str;
} else if (str.charAt(0) === '<') {
str.replace(/<|>/g, "");
return str;
} else {
return str;
}
};
}).call(this);
Run Code Online (Sandbox Code Playgroud)
我的test.js文件是:
test('getGoodNamePart()', function() {
equals(getGoodNamePart("\"Kev Burke\" <kev@inburke.com>"), "Kev Burke", "\"name\" <email> works");
equals(getGoodNamePart("", "", "empty string works"));
equals(getGoodNamePart("kev@inburke.com", …Run Code Online (Sandbox Code Playgroud) 我在使用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)