最近,我发现自己将函数名称作为字符串参数传递给另一个函数,使用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