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

有时我们需要按函数名调用函数。我可以用纯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()
    。而且它比必要的更像锅炉板


  • 有一个简单的黑客吗?或者任何更简单的解决方案?

    您的
    添加是一个局部变量。使用

    @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强制执行此约定。