JavaScript函数的子函数字符串

时间:2015-03-20 09:08:26

标签: javascript string function

我了解到我可以通过表示函数名称的字符串来调用函数。示例:http://www.sitepoint.com/call-javascript-function-string-without-using-eval/

我的问题是,在这种情况下如何调用SubTest函数:

  function Test() {
     this.SubTest = function() { }
  }

  var functionString = 'Test.SubTest';

它不适用于window[functionString]

我甚至试过这个(它是基本的;仅用于测试),但它返回false

function GetFunction(functionName) {
    var functions = functionName.split('.');
    if ( functions.length === 1 ) {
        var functionObj = window[functions[0]];
        if ( typeof functionObj === 'function' )
            return functionObj;
        return false;
    }
    else if ( functions.length > 1 ) {
        var functionObj = window[functions[0]];
        for ( var i = 1; i < functions.length; i++ ) {
          functionObj = functionObj[functions[i]];
        }
        if ( typeof functionObj === 'function' )
            return functionObj;
        return false;
    }
    return false;
}

var functionName = 'Test.SubTest'; // from the above code example
var functionObj = GetFunction(functionName); // returns false

更新

找到了这个:How to turn a String into a javascript function call?,但getFunctionFromString仍无效。

3 个答案:

答案 0 :(得分:1)

事情是Test.SubTest不存在

SubTest是构造函数Test

中定义的属性

这意味着访问此功能的唯一方法是定义一个对象

var t = new Test();
t.SubTest();

如果函数是静态的,函数GetFunction("Test.SubTest")将起作用,如:

function Test() {}
Test.SubTest = function(){}

答案 1 :(得分:0)

问题是因为typeof window['Test.SubTest']未定义...所以,你需要实例化超级对象来调用它的子函数(确实是封装函数)。见下面的代码

  .....
      else if ( functions.length > 1 ) {
    var functionObj = window[functions[0]];
    for ( var i = 1; i < functions.length; i++ ) {
      functionObj = eval('new '+functionObj+'().'+functions[i]);
    }
    if ( typeof functionObj === 'function' )
        return functionObj;
    return false;
    }
  .....

<强> EDITS : 我的评论声明您不想使用eval考虑以下解决方案

  .....
      else if ( functions.length > 1 ) {
    var functionObj = window[functions[0]];
    for ( var i = 1; i < functions.length; i++ ) {
       functionObj =new functionObj()[functions[i]];
    }
    if ( typeof functionObj === 'function' )
        return functionObj;
    return false;
    }
  .....

以下是测试的完整代码

     function Test() {
       this.SubTest = function() { 
        this.subsubtest=function(){ alert('subsubtest')}
     }
    }

    var functionString = 'Test.SubTest.subsubtest';

    function GetFunction(functionName) {
      var functions = functionName.split('.');
      if ( functions.length === 1 ) {
          var functionObj = window[functions[0]];
          if ( typeof functionObj === 'function' )
              return functionObj;
          return false;
      }
      else if ( functions.length > 1 ) {
          var functionObj = window[functions[0]];
          for ( var i = 1; i < functions.length; i++ ) {
           functionObj =new functionObj()[functions[i]];
          }
          if ( typeof functionObj === 'function' )
              return functionObj;
          return false;
      }
      return false;
  }

  var functionName = 'Test.SubTest.subsubtest';  
  var functionObj = GetFunction(functionName); 
  alert(typeof functionObj);//function

答案 2 :(得分:0)

var Test = function () {
  this.SubTest = function () {}
} 

var obj = new Test()

obj['SubTest']()

Test = function () {}
Test.SubTest = function () {}

window['Test']['SubTest']()