调用变量中命名的JavaScript函数

Mat*_*t W 148 javascript variables function

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

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

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

我对如何实施此解决方案的其他建议持开放态度.

Nos*_*dna 255

我会避免评估.

要解决这个问题,您应该了解JavaScript的这些内容.

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

您的问题是考虑点参考方式而不是方括号方式的结果.

所以,为什么不喜欢,

window["functionName"]();
Run Code Online (Sandbox Code Playgroud)

这假设你的功能生活在全球空间.如果你已经命名空间,那么:

myNameSpace["functionName"]();
Run Code Online (Sandbox Code Playgroud)

避免使用eval,并避免将字符串传递给setTimeout和setInterval.我写了很多JS,我从不需要eval."需要"评估来自于不够深入了解语言.您需要了解范围,上下文和语法.如果你曾经坚持过eval,那就问 - 你会很快学会.

  • ...如果你打算做这样的事情,你应该把你的函数定义为一个对象的成员. (3认同)
  • @gom花了我12秒钟在浏览器JavaScript控制台函数myfunc(s){console.log(':'+ s);} window ["myfunc"]('message'); (2认同)

and*_*toi 62

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

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

var a = 'foo';
window[a]();
Run Code Online (Sandbox Code Playgroud)

eval().因为eval()evaaaaaal.

完全像诺斯雷德纳在我前面说的那样是>.<

  • 支持你,因为我是一个好人的地狱. (24认同)

pka*_*ing 23

绝对避免使用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]();
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢。虽然可能不完全是用户需要的,但这正是我需要的。我在调用函数时忘记了 () 。 (3认同)

Bry*_*ore 5

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

eval('var myfunc = ' + variable);  myfunc(args, ...);
Run Code Online (Sandbox Code Playgroud)

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

eval(variable + '();');
Run Code Online (Sandbox Code Playgroud)

适用标准干码警告。

  • 为什么不安全?仅当您传递用户输入时,评估才是邪恶的。就像在eval func服务器端接受客户端数据作为参数一样 (3认同)