function f1 () {
console.log('f1')
}
var s = 'f1'
runLocalFunctionByName(s)
是否可以编写runLocalFunctionByName()
或只是在源代码中输入f1
时调用f1
,但使用保存其名称的变量?我的意思是不将f1
修改为方法,答案显而易见:只需制作myobj.f1 = function
或将其全局声明为f1= function()
。我说的是仅使用function
关键字声明的普通局部函数,而不是vars,全局变量或其他一些对象属性。
答案 0 :(得分:4)
不是没有使用eval
,这是邪恶的(当然用于此目的!)。
全局函数可以作为window
对象的属性调用,但是如果它们位于本地/闭包范围内,那是不可能的。
如果需要按名称调用函数,唯一合适的解决方案是将它们作为属性存储在对象上,然后使用obj[s]()
进行调用。
答案 1 :(得分:0)
这样做的一种方法是使用实例化Function对象。
var runLocalFunctionByName = function(fName) {
return (new Function('','return '+fName+'();'))();
};
使用函数名调用runLocalFunctionByName现在将返回指定函数的输出。
修改强>
如果是本地函数,则必须提及范围,因此我们可以修改代码,例如:
var runLocalFunctionByName = function(fName, scope) {
return (new Function('','return '+(scope?scope:'this')+'.'+fName+'();'))();
};
答案 2 :(得分:0)
除非将其分配给具有可访问范围的变量,否则无法访问其范围之外的本地函数。 MDN: A function defined by a function expression inherits the current scope. That is, the function forms a closure. On the other hand, a function defined by a Function constructor does not inherit any scope other than the global scope (which all functions inherit)