有时我们需要通过名称来调用函数。我可以用普通的JavaScript做到,如下所示:
global=this
function add(a,b){return a+b}
global['add'](1,2)
按预期工作,add()
被调用。
等效的CoffeeScript代码可以写成如下。
global=@
add=(a,b)->a+b
global['add'](1,2)
编译为JavaScript:
(function() {
var add, global;
global = this;
add = function(a, b) {
return a + b;
};
global['add'](1, 2);
}).call(this);
......它不起作用。
Microsoft JScript runtime error: Object doesn't support this property or method
这个问题有一个简单的解决方案吗?
注意:
我没有在浏览器中运行代码,因此没有窗口对象。但是在简单的JS中,我总是可以通过分配global=this
来捕获全局范围,然后从中获取函数指针。
我发现CoffeeScript中的一个解决方案是将所有函数声明为全局对象的成员,如global.add=[function definition]
。但是我必须通常将函数称为global.add()
。它的锅炉板比必要的多。
有简单的黑客攻击吗?或者任何更简单的解决方案?
答案 0 :(得分:8)
您的add
是一个局部变量。使用
@add=(a,b)->a+b
将其附加到global
对象。由于global
是您脚本的全局范围,因此您仍然可以调用add
,而不必在global.
前添加前缀。
答案 1 :(得分:0)
默认情况下,CoffeeScript编译器会封装闭包范围中的每个文件,但您可以通过将--bare开关添加为编译器选项来禁用此行为。
add.coffee:
add = (a,b) -> a+b
运行时:coffee --compile add.coffee
这会产生:
(function() {
var add;
add = function(a,b) {
return a+b;
};
}).call(this);
现在尝试使用--bare开关运行它
coffee --bare --compile add.coffee
这会产生:
var add;
add = function(a, b) {
return a + b;
};
现在你的文件不是封闭范围,你可以像以前那样做。