我得到了一个字符串:
settings.functionName + '(' + t.parentNode.id + ')';
我想翻译成一个函数调用,像这样:
clickedOnItem(IdofParent);
当然,这必须用JavaScript来完成。当我在设置上做警报时。functionName + '(' + t.parentNode.id + ')';似乎每件事都是正确的。我只需要调用它转换成的函数。
传说:
settings.functionName = clickedOnItem
t.parentNode.id = IdofParent
在使用CommonJS规范的javascript中,比如node.js,你可以做我下面展示的事情。这对于通过字符串访问变量非常方便,即使它没有在窗口对象上定义。如果有一个名为MyClass的类,定义在一个名为MyClass.js的CommonJS模块中
// MyClass.js
var MyClass = function() {
// I do stuff in here. Probably return an object
return {
foo: "bar"
}
}
module.exports = MyClass;
然后你可以在另一个名为MyOtherFile.js的文件中做这个漂亮的巫术
// MyOtherFile.js
var myString = "MyClass";
var MyClass = require('./' + myString);
var obj = new MyClass();
console.log(obj.foo); // returns "bar"
CommonJS如此令人愉快的另一个原因。
在使用CommonJS规范的javascript中,比如node.js,你可以做我下面展示的事情。这对于通过字符串访问变量非常方便,即使它没有在窗口对象上定义。如果有一个名为MyClass的类,定义在一个名为MyClass.js的CommonJS模块中
// MyClass.js
var MyClass = function() {
// I do stuff in here. Probably return an object
return {
foo: "bar"
}
}
module.exports = MyClass;
然后你可以在另一个名为MyOtherFile.js的文件中做这个漂亮的巫术
// MyOtherFile.js
var myString = "MyClass";
var MyClass = require('./' + myString);
var obj = new MyClass();
console.log(obj.foo); // returns "bar"
CommonJS如此令人愉快的另一个原因。
虽然我喜欢第一个答案,我讨厌eval,但我想补充的是,还有另一种方法(类似于eval),所以如果你可以绕过它而不使用它,你最好这样做。但在某些情况下,你可能想在ajax调用之前或之后调用一些javascript代码,如果你在自定义属性中有这些代码而不是ajax,你可以使用:
var executeBefore = $(el).attr("data-execute-before-ajax");
if (executeBefore != "") {
var fn = new Function(executeBefore);
fn();
}
或者最终将它存储在函数缓存中,如果您可能需要多次调用它。
再次强调,如果有其他方法,不要使用eval或这个方法。
eval()是你需要这样做的函数,但我建议尝试其中一种方法来尽量减少eval的使用。希望其中一个对你有意义。
存储函数
将函数存储为函数,而不是字符串,然后将其作为函数使用。在哪里存储函数取决于你自己。
var funcForLater = clickedOnItem;
// later is now
funcForLater(t.parentNode.id);
or
someObject.funcForLater = clickedOnItem;
// later is now
(someObject.funcForLater)(t.parentNode.id);
存储函数名称
即使必须将函数名存储为字符串,也可以通过执行以下操作来降低复杂性
(eval(settings.functionName))(t.parentNode.id);
这将最大限度地减少你必须构造和计算的Javascript的数量。
处理程序字典
将您可能需要的所有操作函数放入一个对象中,并使用字符串以字典方式调用它们。
// global
itemActions = { click: clickedOnItem, rightClick: rightClickedOnItem /* etc */ };
// Later...
var actionName = "click"; // Or wherever you got the action name
var actionToDo = itemActions[actionName];
actionToDo(t.parentNode.id);
(次要注意:如果在这里您使用语法itemActions[actionName](t.parentNode.id);那么该函数将作为itemActions的方法被调用。)