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

現在のレキシカル スコープで宣言されている変数と関数は、[]構文を使用して名前でアクセスすることはできません。別の変数の内容に基づいて動的に検索できるのは、プロパティ キー (2 番目の例による) のみです。

これを回避する唯一の方法は、 に頼ることですがeval、これは決して良い考えではありません。

グローバル スコープで宣言された変数と関数には例外が適用されます。これらは実際には のプロパティですwindow

于 2013-05-23T19:45:01.667 に答える
2

私の経験では、クロージャー内に関数を配置することは、関数を「プライベート」と宣言する1つの方法です。これにより、外部からアクセスできなくなります。さらに、コードが縮小されている方法に注目する価値があります。

前:

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

後:

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

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

privateFnもう実際には存在しないことに注意してください。ミニファイヤは、言語の定義により、名前またはその他の方法でその関数の外部にアクセスできないことを認識しています。関数の 1 つを公開したいようです。

于 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です。ただし、最初に匿名オブジェクトに変えることで、グローバル空間を汚染することなく、「クロージャー」内のアイテムを「公開」できます。これにより、オブジェクトが消える前に、オブジェクトに対して1 つだけのメソッド呼び出しを行うことができます ...

プライベートな字句変数を使用し、公開したいメソッドのみを公開するなど、通常のオブジェクト操作を行うことができます。

(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 に答える