2015-10-13 62 views
0

最近,我發現自己將函數名稱作爲字符串參數傳遞給另一個函數,使用typeof檢查它的存在,並在必要時調用它。作爲字符串提供函數名稱的JS模式

我意識到,當我寫這個,我可以傳遞函數引用。

我的問題是,「傳遞函數名稱作爲字符串」模式有一個共同的名稱?而且,它是否是反模式 - 我是否應該儘可能使用引用?

+0

你能告訴你正在做什麼的例子嗎?你不通過參考的理由? – epascarello

+0

@epascarello - 完全沒有理由,這只是我注意到的事情可以完成,我一直在玩它。沒有用例強制這種行爲。 – Ben

回答

2

我不知道它有一個名字,但它絕對是一種反模式。這很難,而且iirc實際上在內存方面會比發送函數引用更糟糕。

function doThisThing() {} 
var action = 'doThisThing'; 

你看,我居然在內存中創建兩個東西的指針每個。

var action = function() {} 

在這裏,我在內存中創建一個單一的項目,action只是一個指針。然後,它的超級容易只是

if (action) action(); 

,甚至更短的

action && action(); 

它是如此容易得多隻是周圍傳遞引用。這只是一個參考。它幾乎沒有開銷,而且更容易。

+1

謝謝Dan,這很有道理。要添加到反模式列表中,可讀性(和維護)也變得更糟! – Ben

0

我不知道具體的命名模式,但如果你將它與通過eval調用該函數相結合,那麼我會說這是反模式。

OK

var obj = { 
    foo: function() {}, 
    bar: function() {}, 
    execute: function(fnName) { 
     this[fnName](); 
    } 
}; 

obj.execute("foo"); 

var obj = { 
    foo: function() {}, 
    bar: function() {}, 
    execute: function(fnName) { 
     eval("obj." + fnName + "()"); 
    } 
}; 
+0

Nope,no eval,只是將它稱爲對象的屬性,例如'OBJ [fnName]()'。 – Ben