2009-11-12 33 views
116

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

任何人都可以告诉我如何调用变量中的javascript函数吗?

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

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

+7

在SO上这已被问了大约18次。 *请*搜索。 – 2009-11-12 16:06:18

+0

听起来更像是一个回调......是吗? – Perpetualcoder 2009-11-12 16:07:08

+2

@新月新鲜,FWIW,我没有看到任何相关的侧边栏,看起来有关。 – 2009-11-12 16:08:18

回答

215

我会避免评估。

为了解决这个问题,你应该知道关于JavaScript的这些东西。

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

你的问题是考虑了参考点方式而不是方括号方式的结果。

那么,为什么不喜欢,

window["functionName"](); 

这是假设你的函数住在全局空间。如果您已命名空间,则:

myNameSpace["functionName"](); 

避免使用eval,并避免将字符串传入setTimeout和setInterval。我写了很多JS,我从不需要评估。 “需要”评估来自于不够深入地了解语言。您需要了解范围,上下文和语法。如果你坚持使用eval,只需问 - 你会很快学会。

+0

这是一个好主意 – 2009-11-12 16:07:09

+3

...如果你打算做这样的事情,你应该把你的函数定义为一个对象的成员。 – Quentin 2009-11-12 16:08:13

+1

我同意,在这种情况下应避免使用'eval()'来避免XSS问题。 – pkaeding 2009-11-12 16:08:35

4

这有点不好看,但是它的第一个东西就是在我脑海中浮现出来的。这也应该允许你传递参数:

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

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

eval(variable + '();'); 

标准干码警告适用。

+0

它很好,解决了我的问题,但是使用eval很好吗? – nirmal 2015-08-05 09:05:14

+1

为什么它不安全?只有当你通过用户输入时,Eval才是邪恶的。像有一个eval func服务器端接受客户端数据作为参数 – avalanche1 2016-08-16 09:20:38

50

如果在全球范围内it's it's更好地使用:

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

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

eval()。因为eval()evaaaaaal。正如Nosredna在我之前40秒说的那样>>。 <

+0

我看到我们都这么想。 :-) – Nosredna 2009-11-12 16:06:13

+0

是的,upvoted你的答案,在你打我的公平;) – anddoutoi 2009-11-12 16:15:58

+20

Upvoted你的,因为我是一个好人的地狱。 – Nosredna 2009-11-12 17:06:32

19

绝对避免使用eval做这样的事情,否则你将面临XSS(跨站点脚本)漏洞。

例如,如果你使用这里提出的eval解决方案,一个恶毒的用户可以发送一个链接到他们的受害者是这个样子:

http://yoursite.com/foo.html?func=function() {警报(“林%20英寸%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这事情会失败,但不会执行任何代码。

+0

谢谢。虽然可能不完全是用户需要的,但这正是我所需要的。我在调用函数时忘了我的()。 – cepatt 2016-10-25 18:19:24

+0

最适合节点应用!谢谢! – THpubs 2016-12-27 07:40:51