2012-06-20 42 views
0

測試功能在函數內我需要測試是否存在另一個變量函數,然後在它調用時調用它。從變量

function div1_load(){ 
    // do something 
} 

function main(id){ 
    var func = id + '_load'; 
    if (func is function) { 
    func.call(); 
    } 
} 
main('div1'); 

我可以考慮兩種測試方法,但都涉及eval(),我想避免這兩種方法。

  1. 的typeof的eval(FUNC)=== '功能'
  2. 的eval( 'typeof運算(' +功能+ ')')=== '功能'

有沒有一種方法使用eval()? 如果不是,我的兩種方法中哪一種最安全?

+0

爲什麼它需要是一個變量?它可以有不同的值嗎?如果是這樣,爲什麼函數是全局的而不是數據結構的成員(例如'{div1_load:function(){...},div2_load ....}' – Quentin

+0

[如何執行JavaScript函數當我有一個字符串的名稱](http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string) – 2012-06-20 12:05:50

+0

典型的發佈後發現答案@Quentin:div1_load()並不總是被定義的,並且沒有數據結構,因爲它保持簡單 – Kim

回答

2
function main(id, ns) { 
    if (!ns) { 
     ns = window; 
    } 
    if (typeof ns[id + '_load'] === "function") { 
     ns[id + '_load'](); 
    } 
} 

function div1_load() { 
    alert("div1_load() was called"); 
} 

main('div1'); 

var test = { 
    div1_load: function() { 
     alert("test.div1_load() was called"); 
    } 
}; 

main('div1', test);​ 
+0

我在發佈後在這裏找到了它http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-name-as-a-string – Kim

+0

如果函數不是全局的,也不屬於某個對象呢?就像'(function( ){function test(){} function main(){/ * test test()exists?* /}());' –

+0

@FlorianMargaine:see edit。至於你的例子,外層函數是一個隱性功能;探索其內部功能(IMO)是沒有意義的。 –

2

假設的功能是全球性的(即屬於window對象,你可以檢查typeof

if(typeof window[id] === 'function') { } 
+0

如果函數不是全局的,也不屬於某個對象呢?就像'(function(){function test(){} function main(){/ * does test()exists?* /}());' –

+0

我想你可能是SOL,恐怕。函數分配到的名稱空間是匿名的;這不是使用閉包的全部意義嗎? – BenM

1

如果函數的全局命名空間(window)內進行分配,你可以檢查函數名字符串是window[function name] instanceof Function的函數,如果它是在(僞)名稱空間內分配的,則使用SomeNamespace[function name]。換句話說,函數可以從名稱空間(全局(瀏覽器中的window))作爲屬性/方法檢索,或定義在你的代碼)。

function div1_load(){ 
    // do something 
} 

function main(id){ 
    if (window[id+'_load'] instanceof Function) { 
    window[id+'_load'].call(); 
    } 
} 
main('div1') 

[編輯基於評論在一個匿名,立即實例化的功能的情況下,這是不行的。來自@Florian Margaine的例子可以這樣調整:

var MyPersonalNamespace = (function() { 
    function test() {} 
    function main(someid) { 
    if (this[someid] instanceof Function){ 
     this[someid].call(); 
    } 
    } 
    return {test: test, main: main}; 
}()); 
MyPersonalNamespace.main('test'); 
+0

如果函數不是全局的,也不屬於某個對象,該怎麼辦?就像''function(){function test(){} function main(){/ * test test()exists?* /}());' –

+0

那麼,在這種情況下,它顯然不起作用。 – KooiInc