调用以变量命名的 jQuery 函数

Posted

技术标签:

【中文标题】调用以变量命名的 jQuery 函数【英文标题】:calling a jQuery function named in a variable 【发布时间】:2012-01-25 04:12:54 【问题描述】:

我有几个 jQuery 函数,例如 function setOne(); setTwo(); setThree();

还有一个变量var number,分别取值“一”、“二”、“三”。

当数值为“一”时如何调用函数“setOne()”,当数值为“二”时如何调用函数“setTwo”等等...?

提前非常感谢您。任何帮助将不胜感激。

【问题讨论】:

在我看来就像普通的 javascript 函数。 【参考方案1】:

如果你的函数在全局范围内(在窗口对象上),你可以这样做:

// calls function setOne, setTwo, ... depending on number.
window["set" + number](); 

使用eval 将允许您在本地范围内运行函数:

eval("set" + number + "()");

When is JavaScript's eval() not evil?

【讨论】:

最佳答案,我接受这个,简单而有用,你完全明白我的意思!谢谢!如果你愿意,你可以投票给我的问题。 this["set" + number](); 不起作用。仅当 setXthis 所指的任何属性时,而不是当 setX 是局部变量时。 抱歉,但如果 number 与 bobighorus 所描述的完全一样(例如 onetwothree),那么这将产生错误,如 setone != setOne ?! @AndreasAL 啊,谢谢! ;) 那么为什么不从我的答案中复制该部分,以便我们也将其包含在接受的答案中:) 太棒了!恭喜【参考方案2】:

创建name -> function 地图:

var funcs = 
    'one': setOne,
    'two': setTwo
    /*...*/
;

然后你调用函数:

funcs[number]();

【讨论】:

其实 AndreasAL 的答案更好。人们需要明白,在 JavaScript 中,一切都是字典,甚至函数也只是全局范围字典中的条目,您可以通过这种方式访问​​。 感谢您的回答 Felix,但这似乎是一个开关迭代。我需要一个像 set+number+() 这样的自动解决方案,这意味着 setOne(); .我希望我是清楚的。 @Tigraine:只有在函数是全局的情况下才有效,这通常不是一个好主意(全局命名空间污染)。 @bobighorus:好吧,您也可以将函数直接分配给对象,而不是事先定义它们。无论您是使用function setOne() ...; 还是funcs['one'] = function() ...;,都不会产生太大的影响。优点是你的代码结构更简洁,更容易理解。 @Felix Kling:您仍然可以在更深的范围内声明函数,并按照 AndreasAL 的建议使用 this[] 表示法..【参考方案3】:

如果变量详细说明了 JQuery 函数的实际名称,并且您想将该函数应用于 DOM 元素(如“body”),则可以执行以下操作:

 $('body')['function-name']('params');

【讨论】:

【参考方案4】:

如果您的函数在全局范围内,请尝试:

function setOne() 
  console.log('setOne called');

function setTwo() 
  console.log('setTwo called');

function setThree() 
  console.log('setThree called');


var number, funcName;

number = 'one';
funcName = 'set' + number.charAt(0).toUpperCase() + number.slice(1);
window[funcName](); // output: setOne called

number = 'two';
funcName = 'set' + number.charAt(0).toUpperCase() + number.slice(1);
window[funcName](); // output: setTwo called

number = 'three';
funcName = 'set' + number.charAt(0).toUpperCase() + number.slice(1);
window[funcName](); // output: setThree called

【讨论】:

【参考方案5】:

就这么简单:

function hello()
    alert("hello");

var str = "hello";
eval(str+"()");

【讨论】:

是的,但我必须调用一个函数! @bobighorus 这将调用函数 hello()... 使用 var str = "One"; eval("set" + str + "()"); 作为您的示例。您甚至可以通过这种方式设置命名参数...eval("set" + str + "(parameterName)");【参考方案6】:

为什么要为此设置三个函数?

var number;
function setNumber(n) 
    number = n;

setNumber(1) 将数字设置为 1

setNumber(2) 会将数字设置为 2

【讨论】:

谢谢你的回答,但我认为你不明白我的问题...:)

以上是关于调用以变量命名的 jQuery 函数的主要内容,如果未能解决你的问题,请参考以下文章

Jquery,YUI这个著名js库名称作用的理解

Jquery的命名冲突

python中怎样查看已加载的命名空间中所有变量和函数

总结整理前端‘变量名’‘类名’‘函数名’的命名规则

matlab 批量运算命名变量

js命名规则