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

Javascript 按名称调用或访问本地函数,javascript,Javascript,是否可以编写runLocalFunctionByName,或者只调用f1而不在源代码中键入f1,而是使用保留其名称的变量?我的意思是,在不将f1修改为方法的情况下,答案是显而易见的:只需生成myobj.f1=函数或像f1=函数一样全局声明它。我说的是仅使用function关键字声明的普通局部函数,而不是作为vars、global vars或其他对象属性声明的函数。不使用eval,这在用于此目的时肯定是有害的 全局函数可以作为窗口对象的属性调用,但如果它们位于局部/闭包范围内,则不可能 如果您需要

是否可以编写runLocalFunctionByName,或者只调用f1而不在源代码中键入f1,而是使用保留其名称的变量?我的意思是,在不将f1修改为方法的情况下,答案是显而易见的:只需生成myobj.f1=函数或像f1=函数一样全局声明它。我说的是仅使用function关键字声明的普通局部函数,而不是作为vars、global vars或其他对象属性声明的函数。

不使用eval,这在用于此目的时肯定是有害的

全局函数可以作为窗口对象的属性调用,但如果它们位于局部/闭包范围内,则不可能

如果您需要按名称调用函数,唯一正确的解决方案是将它们存储为对象上的属性,然后使用obj[s]调用它们。

如果不使用eval,则使用eval肯定是有害的

全局函数可以作为窗口对象的属性调用,但如果它们位于局部/闭包范围内,则不可能


如果需要按名称调用函数,唯一合适的解决方案是将它们存储为对象上的属性,然后使用obj调用它们。

一种方法是使用实例化函数对象

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

var s = 'f1'

runLocalFunctionByName(s)
现在,使用函数名调用runLocalFunctionByName将返回命名函数的输出

编辑

对于本地函数,必须提及范围,因此我们可以修改代码,以便:

var runLocalFunctionByName = function(fName) { 
    return (new Function('','return '+fName+'();'))(); 
};

一种方法是使用实例化函数对象

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

var s = 'f1'

runLocalFunctionByName(s)
现在,使用函数名调用runLocalFunctionByName将返回命名函数的输出

编辑

对于本地函数,必须提及范围,因此我们可以修改代码,以便:

var runLocalFunctionByName = function(fName) { 
    return (new Function('','return '+fName+'();'))(); 
};

除非将局部函数分配给具有可访问范围的变量,否则无法访问其范围之外的局部函数

除非将局部函数分配给具有可访问范围的变量,否则无法访问其范围之外的局部函数

你为什么要这么做?我怀疑这是一个XY问题,有一个更好的方法来解决它。有点相关:,.f1在这里不是一个局部函数,由局部定义。你的意思是它是在其他函数中定义的吗?为什么需要这样做?我怀疑这是一个XY问题,有一个更好的方法来解决它。有点相关:,.f1在这里不是局部函数,而是局部函数。你的意思是它是在其他函数中定义的吗?这只适用于全局函数,而不是局部函数。是的。在这种情况下,我们可以修改此代码以包含本地函数的作用域。如何修改?请表明,这是要求的。在OPs示例中,您会将什么作为范围传递?在不了解OP试图实现的目标的情况下提出这种半评估式解决方案是一个糟糕的想法。这只适用于全局功能,而不是本地功能。是的。在这种情况下,我们可以修改此代码以包含本地函数的作用域。如何修改?请表明,这是要求的。在OPs示例中,你会将什么作为范围传递?在不了解OP试图实现什么的情况下提出这种半评估解决方案是一个糟糕的想法。他不担心范围界定。他试图调用一个字符串形式的函数名,他不担心作用域。他试图调用一个函数,而他拥有的是字符串形式的函数名。