Javascript 按函数名调用函数
有时我们需要按函数名调用函数。我可以用纯JavaScript实现,如下所示:Javascript 按函数名调用函数,javascript,coffeescript,Javascript,Coffeescript,有时我们需要按函数名调用函数。我可以用纯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
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
这个问题有简单的解决办法吗
注:
global=this
来捕获全局范围,然后从中获取函数指针global.add=[function definition]
。但是我通常必须调用函数作为global.add()
。而且它比必要的更像锅炉板有一个简单的黑客吗?或者任何更简单的解决方案?您的
添加是一个局部变量。使用
@add=(a,b)->a+b
将其附加到全局
对象。由于global
是脚本的全局作用域,因此您仍然可以调用add
,而无需在其前面加上global.
默认情况下,CoffeeScript编译器将每个文件包装在闭包作用域中,但您可以通过添加--bare开关作为编译器选项来禁用此行为
加:咖啡:
add = (a,b) -> a+b
运行时:coffee——编译add.coffee
这将产生:
(function() {
var add;
add = function(a,b) {
return a+b;
};
}).call(this);
var add;
add = function(a, b) {
return a + b;
};
现在试着用裸开关运行它
coffee--bare--compile add.coffee
这将产生:
(function() {
var add;
add = function(a,b) {
return a+b;
};
}).call(this);
var add;
add = function(a, b) {
return a + b;
};
现在,您的文件不属于闭包范围,您可以按照以前的方式进行操作。这个答案是正确的。当您在CoffeeScript中编写x=y
时,您总是在做var x
声明或引用同一文件中现有的var x
声明。省略var
来创建globals在JS界被广泛认为是一种糟糕的做法;CoffeeScript强制执行此约定。