javascript:关闭时访问函数

时间:2013-05-23 19:40:59

标签: javascript closures

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

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

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

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

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

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

3 个答案:

答案 0 :(得分:10)

使用[]语法无法通过名称访问当前词法作用域中声明的变量和函数 - 只能根据另一个变量的内容动态查找属性键(根据您的第二个示例)。

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

异常适用于在全局范围内声明的变量和函数 - 这些实际上是window的属性。

答案 1 :(得分: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.');

答案 2 :(得分:1)

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

在:

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

后:

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

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

注意privateFn如何不再存在?根据语言的定义,minifier知道没有任何东西可以通过名称或其他方式访问该函数。你似乎想把你的一个职能公之于众。