2017-06-29 53 views
2

說我有一個寬鬆隆乳封閉其中包含一些功能我想要訪問[大大簡化]使用call調用封閉函數或應用?

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 foo = Process.Fred.Add(1,2,3); 

如果我有一個字符串表示在一個對象我想調用的函數名稱和一些參數,我該如何調用它?

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

我不能使用data.function.apply(data.function.params),因爲它會導致打印錯誤。

+0

你可以使用'Proccess [data.function]。適用(data.params)'。你不能使用一個字符串上的應用程序 – dloeda

+0

但是這將是'Process [「Process.Fred.Add」]。apply(...' – frumbert

+0

是的,你會改變乾淨的東西比'Proccess [data.function.split ('。')[1]] [data.function.split('。')[2]]。apply(data.params)''但這是本質的.Eval是如此不安全 – dloeda

回答

2

如果Process在全局範圍內,則可以遍歷該樹以獲取對該方法的引用,以便可以執行該方法。

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: : {} } 

比降低線將是

...減少((O,K)=> 0 [k]的,的MyStuff)

相關問題