我了解到我可以通过表示函数名称的字符串来调用函数。示例: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
仍无效。
答案 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']()