9

我在变量中有一个函数的名称,但一切都在一个闭包中。有了这个变量,我想调用函数,像这样

(function(func) {
      this[func]() ;         // doesn't work

      function bar() {}
      function foo() {}
})('bar') ;

像这样的事情是否可能,或者我应该例如将函数添加到变量中,比如

(function(func) {        
      var ns = {
          bar: function() {},
          foo: function() {}
      };

      ns[func]() ;         // OK
})('bar') ;
4

3 回答 3

11

在当前词法范围内声明的变量和函数不能使用[]语法按名称访问 - 只有属性键(根据您的第二个示例)可以根据另一个变量的内容动态查找。

解决这个问题的唯一方法是诉诸eval,这几乎不是一个好主意。

一个例外适用于在全局范围内声明的变量和函数——它们实际上是window.

于 2013-05-23T19:45:01.667 回答
2

以我的经验,将函数放在闭包中是声明它“私有”的一种方式——这样外部的任何东西都无法访问它。此外,值得研究的是代码被缩小的方式:

前:

(function() {
    function privateFn(var1, var2) {
        //TODO
    }
    return {
        publicFn: function() { }
    }
})();

后:

(function() {
    function _a(_0, _1) {

    }
    return {
        publicFn: function() { }
    }
})();

请注意如何privateFn不再真正存在?根据语言的定义,缩小器知道没有任何东西可以在外部访问该函数 - 通过名称或其他方式。您似乎想公开您的一项功能。

于 2013-05-23T19:52:14.637 回答
1

像这样的东西:

(new function() {
    this.a = function(x) {
        document.getElementById('out').innerHTML += x;
    }
})['a']('boom.');

http://jsfiddle.net/CT4du/1/

闭包使所有内容保持私密。通常,this在闭包中只指window. 但是,您可以通过首先将其转换为匿名对象来在“闭包”中“公开”项目而不会污染全局空间。这使您可以在对象消失之前对对象进行一个且只有一个方法调用...

你可以做普通的对象事情,比如使用私有的、词法变量并只公开你想要公开的方法。

(new function() {

    var a = function(x) { document.getElementById('out').innerHTML += x; }
    var b = function() { a(d); }
    var c = function() { /* ... */ }
    var d = "whatever";

    // expose two of them .. 
    this.a = a;
    this.b = b;

})['a']('boom.');
于 2013-05-23T19:49:59.360 回答