当我将其名称作为字符串时执行JavaScript函数 - 不起作用

时间:2016-09-11 02:59:58

标签: javascript

我需要通过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');

1 个答案:

答案 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

此外,以下是您在代码段中的代码,该代码正常运行。

&#13;
&#13;
// 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;
&#13;
&#13;