2011-03-29 2 views
1

사이트의 섹션을 기반으로 이름 공간이 지정된 여러 개의 외부 JavaScript가 있습니다. 동적으로 메소드를 실행하려고하지만 메소드를 호출 할 수 없습니다. 아무도 내게 문제가 무엇인지 말할 수 있습니까? 나는이, 방법 화재 추가하면JavaScript를 통해 명명 된 간격 메서드를 동적으로 실행합니다.

:

Namespace.Something.init() 

하지만 이런 식으로 할 때, 아무 일도 발생하지 않습니다를 (참고 : 네임 스페이스 Namespace.Something 동일하고 FUNCTIONNAME는 초기화와 동일) :

namespace[functionname](); 
+0

'functionname === init' 또는'functionname === 'init''입니까? – Gumbo

+0

functionname === 'init' – Cofey

답변

2

다음 중 작동하지 않는 eval을 사용하고 싶지 않은 경우.

는 모든 방법 깊은 같은 수준 있다고 가정 즉 namespace.somename.somemethod 네임 스페이스로

var Namespace = { 
    Something: { 
    init: function() { 
     console.log('init called'); 
    } 
    } 
}; 

Namespace.Something.init(); 

var namespace = "Namespace"; 
var section = "Something"; 
var method = "init"; 

this[namespace][section][method](); 

는 전역 범위의 부분이 [공간]에서 액세스 할 수

+0

이 [namespace] [section] 메서드; 계속 오류가 발생합니다 : "누락; before 문". – Cofey

+0

그것은 기능입니다. 'this [namespace] [section] method();' –

+0

죄송합니다. 코드가 올바르게 올바르게 포맷되지 않았습니다. –

0

몇 주 전에 같은 질문을했지만 나는 약간 다른 표현을했다고 생각합니다. this.

기본적으로 한 번에 functionname 문자열을 구문 분석해야합니다.

그런데 그 대답의 코드 walk_path을 사용하여, 여기에 인수를 포함한 문자열에서 함수를 실행하기 위해 작성한 일반적인 목적 함수가 있습니다.

// run an arbitrary function from a string. Will attempt to parse the args from parenthesis, if none found, will 
// use additional arguments passed to this function. 
utils.runFunction = function (funcdef) { 
    var argPos = funcdef.indexOf('('); 
    var endArgPos = -1; 
    var args = undefined; 
    var func = funcdef; 
    if (argPos > 0) { 
     endArgPos = funcdef.indexOf(')', argPos); 
     if (endArgPos > 0) { 
      args = funcdef.substring(argPos + 1, endArgPos).split(','); 
      func = funcdef.substring(0, argPos - 1); 
     } 
    } else { 
     args = Array.prototype.slice.call(arguments, 1); 
    } 
    var func = walk_path(window, func); 
    return !args ? func() : func.apply(null, args); 
}; 
0
var methodName = 'Namespace.Something.init'; 
var methodParts = methodName.split('.'); 
var method = this; 
for (var i=0; i < methodParts.length; i++) { 
    method = method[methodParts[i]]; 
}; 
method(the arguments you want); 
입니다
관련 문제