你可以,是的.你是否应该完全是另一个问题,答案几乎肯定是“不”(就执行字符串而言;就下面所示的替代方案而言,有时它是有用的).
你评估代码片段的方式(你所拥有的不只是一个函数名,因为())将使用可怕的eval:
eval(fn);
几乎总是比使用eval更好的选择. (见下文.)
评估示例:
$("#example").on("click", function() {
var fn = $("#example").attr("data-function-name");
eval(fn);
});
function showAllElements() {
alert("showAllElements was called");
}
Click Me
其中一个更好的选择是将函数引用存储为对象的属性,然后使用括号表示法根据函数名称获取函数引用:
例:
var functions = {
showAllElements: function() {
alert("showAllElements was called");
}
};
$("#example").on("click", function() {
var fn = $("#example").attr("data-function-name");
functions[fn]();
});
Click Me
请注意,我只是存储函数名称,而不是任意代码.
更新:如果您的功能嵌套在对象内,请参见canon’s answer,以便巧妙地处理它,例如: mumble.foo.doSomething,使用reduce. (reduce是ES5功能,但它是可填充的.)
旁注:除非您执行的操作不仅仅是检索data- *属性的值,否则请不要使用数据,请使用attr. data初始化元素的数据高速缓存,读入该元素的所有data- *属性,并将它们复制到高速缓存.如果你没有使用它,没有理由这样做.您使用数据访问data- *属性的想法是一种常见的误解.