2017-06-29 5 views
2

は、私は、オブジェクトの文字列表現を持っている場合は、私が直接コールを使用してクロージャ内の関数を呼び出すか、適用しますか?

var foo = Process.Fred.Add(1,2,3); 

を関数を呼び出すことができ、私は、私がアクセスできるようにするいくつかの機能が含まれている緩い増強閉鎖[大幅に簡略化]

var Process = (function(Process,$){ 
    _thing1 = function(a,b,c) { 
     return a + b + c; 
    } 
    _thing2 = function(a,b,c) { 
     return $(a).html(b + c); 
    } 
    return { 
     Fred: { 
      Add: _thing1 
     }, 
     Bob: { 
      Add: _thing2 
     } 
    } 
}(Process || {},jQuery)); 

を持っていると言います私が呼びたい関数名といくつかの引数について、どのように呼びますか?

var data = { 
    "function": "Process.Fred.Add", 
    "params": [1,2,3] 
} 

タイプエラーが発生するため、data.function.apply(data.function.params)は使用できません。

+0

([K] O(O、K)=>のMyStuff)を削減...

だろう'Proccess [data.function] .apply(data.params)'です。あなたは文字列に適用を使用することはできません – dloeda

+0

これは 'Process [" Process.Fred.Add "]となりますapply(...' – frumbert

+0

はい、これよりもクリーンなものに変更します 'Proccess [data.function.split ( '。')[1]] [data.function.split( '。')[2]]。apply(data.params) 'これが本質です。 – dloeda

答えて

2

プロセスがグローバルスコープ内にある場合は、メソッドを参照できるようにツリーを移動して実行することができます。

var Process = (function(Process, $) { 
 
    _thing1 = function(a, b, c) { 
 
    return a + b + c; 
 
    } 
 
    _thing2 = function(a, b, c) { 
 
    return $(a).html(b + c); 
 
    } 
 
    return { 
 
    Fred: { 
 
     Add: _thing1 
 
    }, 
 
    Bob: { 
 
     Add: _thing2 
 
    } 
 
    } 
 
}(Process || {}, jQuery)); 
 

 
var data = { 
 
    "function": "Process.Fred.Add", 
 
    "params": [1, 2, 3] 
 
} 
 

 
var result = data.function.split(/\./g)   //break up string into pieces 
 
       .reduce((o, k) => o[k], window) //walk the tree to get method reference 
 
       .apply(this, data.params);  //execute the method with the parameters 
 
console.log(result)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

それはあなたが参照できるどこかでProcessを置く必要があるよりも、グローバルスコープにない場合。

EG:ラインを減らすよりも、オブジェクト

var myStuff = { "Process: : {} } 

はあなたが使用することができ

関連する問題