按名称调用或访问本地函数

时间:2015-12-24 11:40:15

标签: javascript

function f1 () {
    console.log('f1')
}

var s = 'f1'

runLocalFunctionByName(s)

是否可以编写runLocalFunctionByName()或只是在源代码中输入f1时调用f1,但使用保存其名称的变量?我的意思是不将f1修改为方法,答案显而易见:只需制作myobj.f1 = function或将其全局声明为f1= function()。我说的是仅使用function关键字声明的普通局部函数,而不是vars,全局变量或其他一些对象属性。

3 个答案:

答案 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)