最近,我發現自己將函數名稱作爲字符串參數傳遞給另一個函數,使用typeof
檢查它的存在,並在必要時調用它。作爲字符串提供函數名稱的JS模式
我意識到,當我寫這個,我可以傳遞函數引用。
我的問題是,「傳遞函數名稱作爲字符串」模式有一個共同的名稱?而且,它是否是反模式 - 我是否應該儘可能使用引用?
最近,我發現自己將函數名稱作爲字符串參數傳遞給另一個函數,使用typeof
檢查它的存在,並在必要時調用它。作爲字符串提供函數名稱的JS模式
我意識到,當我寫這個,我可以傳遞函數引用。
我的問題是,「傳遞函數名稱作爲字符串」模式有一個共同的名稱?而且,它是否是反模式 - 我是否應該儘可能使用引用?
我不知道它有一個名字,但它絕對是一種反模式。這很難,而且iirc實際上在內存方面會比發送函數引用更糟糕。
function doThisThing() {}
var action = 'doThisThing';
你看,我居然在內存中創建兩個東西的指針每個。
var action = function() {}
在這裏,我在內存中創建一個單一的項目,action
只是一個指針。然後,它的超級容易只是
if (action) action();
,甚至更短的
action && action();
它是如此容易得多隻是周圍傳遞引用。這只是一個參考。它幾乎沒有開銷,而且更容易。
謝謝Dan,這很有道理。要添加到反模式列表中,可讀性(和維護)也變得更糟! – Ben
我不知道具體的命名模式,但如果你將它與通過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 + "()");
}
};
Nope,no eval,只是將它稱爲對象的屬性,例如'OBJ [fnName]()'。 – Ben
你能告訴你正在做什麼的例子嗎?你不通過參考的理由? – epascarello
@epascarello - 完全沒有理由,這只是我注意到的事情可以完成,我一直在玩它。沒有用例強制這種行爲。 – Ben