我需要通过var字符串调用一个函数。我看到之前已经问过这个问题: How to execute a JavaScript function when I have its name as a string
但解决方案无效。我做错什么了吗? https://jsfiddle.net/puLh9keg/
// a.callThis is the function that will be called using var string
var a = {
callThis:
function (ok, param1, param2) {
alert(ok + "|" + param1 + "|" + param2);
}
}
// Below is from https://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string
function executeFunctionByName(functionName, context /*, args */) {
var args = [].slice.call(arguments).splice(2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(context, args);
}
// try call a.callThis by var string
var fn = 'a.callThis';
executeFunctionByName(fn, window, true, 'param1', 'param2');
答案 0 :(得分:1)
您的代码按书面形式工作。正如多个人在评论中提到的那样,你的JSFiddle不起作用的原因是你已经假设window
是你操作的全局范围。但是,您已将JSFiddle JavaScript设置为运行onLoad
。这将它包装在onload
处理程序中。因此,与您的假设相反,您的代码不会以window
作为全局范围运行,这使得它不起作用。您可以通过将JavaScript LOAD TYPE
选项更改为No wrap - in <head>
或No wrap - in <body>
来使代码在JSFiddle上运行。
这是JSFiddle that has that change implemented。
此外,以下是您在代码段中的代码,该代码正常运行。
// a.callThis is the function that will be called using var string
var a = {
callThis:
function (ok, param1, param2) {
alert(ok + "|" + param1 + "|" + param2);
}
}
// Below is from
// http://stackoverflow.com/questions/359788
// /how-to-execute-a-javascript-function-when-i-have-its-name-as-a-string
function executeFunctionByName(functionName, context /*, args */) {
var args = [].slice.call(arguments).splice(2);
var namespaces = functionName.split(".");
var func = namespaces.pop();
for(var i = 0; i < namespaces.length; i++) {
context = context[namespaces[i]];
}
return context[func].apply(context, args);
}
// try call a.callThis by var string
var fn = 'a.callThis';
executeFunctionByName(fn, window, true, 'param1', 'param2');
&#13;