调用以变量命名的 JavaScript 函数

IT技术 javascript function variables
2021-02-01 19:00:27

我有一个 JavaScript 变量,其中包含一个 JavaScript 函数的名称。该函数通过使用 $.ajax 等加载和放置而存在于页面上。

谁能告诉我如何调用变量中命名的 javascript 函数?

函数的名称在一个变量中,因为用于加载页面片段(插入到当前页面)的 URL 包含要调用的函数的名称。

我愿意接受有关如何实施此解决方案的其他建议。

4个回答

我会避免评估。

要解决这个问题,你应该了解 JavaScript 的这些东西。

  1. 函数是一等对象,因此它们可以是对象的属性(在这种情况下它们称为方法)甚至是数组的元素。
  2. 如果您没有选择函数所属的对象,则它属于全局范围。在浏览器中,这意味着您将它挂在名为“window”的对象上,这是全局变量所在的位置。
  3. 数组和对象密切相关。(谣言甚至可能是乱伦的结果!)您通常可以使用点.代替方括号[],反之亦然。

您的问题是考虑点引用方式而不是方括号方式的结果。

那么,为什么不喜欢这样的东西,

window["functionName"]();

那是假设您的函数存在于全局空间中。如果您已命名空间,则:

myNameSpace["functionName"]();

避免使用 eval,并避免将字符串传入 setTimeout 和 setInterval。我写了很多 JS,我从不需要 eval。“需要” eval 来自对语言的了解不够深入。您需要了解范围、上下文和语法。如果你曾经被 eval 困住,问问——你会学得很快。

@gom 花了我 12 秒在浏览器中尝试它 JavaScript 控制台函数 myfunc(s) { console.log(':'+s);} window["myfunc"]('message');
2021-03-15 19:00:27
我同意,eval()在这种情况下应该避免,以避免 XSS 问题。
2021-03-16 19:00:27
...如果你打算做这样的事情,你可能应该将你的函数定义为一个对象的成员。
2021-03-18 19:00:27
我同意 - 我需要学习很多关于 javascript 的知识,但必要的坏处是我现在确实需要使用它。我似乎记得有关在 eval 中执行的 js 的某些内容仅在 eval 执行期间存在(包括它的计时器等) - 导致更多问题。这是真的。无论如何,我最终通过消除动态调用函数的需要解决了这个问题(oop!)我最初想这样做是因为只有我自己的页面才会包含 javascript,而不是外部页面。
2021-03-30 19:00:27
@David Dorwald:没错。命名空间更可取。你不希望一些函数名来自一个 ajax 调用来破坏其他东西。
2021-03-31 19:00:27

如果它在全局范围内,最好使用:

function foo()
{
    alert('foo');
}

var a = 'foo';
window[a]();

eval()因为eval()evaaaaaal

就像诺斯雷德娜在我之前 40 秒说的那样 >.<

是的,公平地说,你击败了我,支持你的回答;)
2021-03-25 19:00:27
赞成你的,因为我是一个非常好的人。
2021-04-02 19:00:27

绝对避免使用eval做这样的事情,否则你会暴露自己的 XSS(跨站点脚本)漏洞。

例如,如果您要使用eval此处提出解决方案,恶意用户可能会向受害者发送如下所示的链接:

http://yoursite.com/foo.html?func=function() {alert('Im%20In%20Teh%20Codez');}

他们的 javascript,而不是你的,会被执行。当然,这段代码可能会做一些比弹出警报更糟糕的事情;它可以窃取 cookie,向您的应用程序发送请求等。

因此,请确保您永远不会eval出现来自用户输入的不受信任的代码(以及查询字符串 id 上的任何内容都被视为用户输入)。您可以将用户输入作为指向您的函数的键,但如果给定的字符串与对象中的键不匹配,请确保不执行任何操作。例如:

// set up the possible functions:
var myFuncs = {
  func1: function () { alert('Function 1'); },
  func2: function () { alert('Function 2'); },
  func3: function () { alert('Function 3'); },
  func4: function () { alert('Function 4'); },
  func5: function () { alert('Function 5'); }
};
// execute the one specified in the 'funcToRun' variable:
myFuncs[funcToRun]();

如果funcToRun变量不指向myFuncs对象中的任何内容,这将失败,但它不会执行任何代码。

谢谢你。虽然可能不是用户真正需要的,但这正是我所需要的。我在调用我的函数时忘记了我的 ()。
2021-04-02 19:00:27
最适合节点应用程序!谢谢!
2021-04-05 19:00:27

这有点难看,但这是我脑海中浮现的第一件事。这也应该允许您传入参数:

eval('var myfunc = ' + variable);  myfunc(args, ...);

如果您不需要传入参数,这可能会更简单。

eval(variable + '();');

适用标准干码警告。

很好,解决了我的问题,但是可以使用 eval 吗?
2021-03-15 19:00:27
为什么会不安全?仅当您将用户输入传递给它时,Eval 才是邪恶的。就像有一个 eval func 服务器端,它接受客户端数据作为参数
2021-03-23 19:00:27