2012-10-03 8 views
0

eval을 사용하지 않고 문자열을 사용하여 범위를 포함하여 함수를 호출하는 방법은 무엇입니까?문자열에서 함수를 호출하는 방법은 무엇입니까?

아이디어는 dragEndCallback 속성 안에 콜백을 지정하고 드래그 시작 및 종료 객체에 매개 변수를 지정하는 것입니다. 제 경우의 일종의 제네릭 드래그 앤 드롭.

대부분의 사람들은 eval을 사용하라고 말하지만, 안전하지 않고, 느리고, 전반적으로 나쁜 아이디어입니다.

다음
"NamespaceA.functionName" 
"functionName" 
"NamespaceB.NamespaceA.functionName" 
"ClassB.methodName" 

답변

1

이 그것을 할 수있는 일반 깨끗하고 편리한 방법입니다

는 여기에 내가 지원하고자하는 몇 가지 예제 문자열입니다. 함수가 없으면 undefined를 반환합니다. "범위"에 의해 당신이 함수에 가지고 어떤 범위를 의미하는 경우

window.getFunctionFromString = function(string) 
{ 
    var scope = window; 
    var scopeSplit = string.split('.'); 
    for (i = 0; i < scopeSplit.length - 1; i++) 
    { 
     scope = scope[scopeSplit[i]]; 

     if (scope == undefined) return; 
    } 

    return scope[scopeSplit[scopeSplit.length - 1]]; 
} 
+0

를 반환 유용 할 수 있습니다 개체 그것은뿐만 아니라의 속성입니다. 'NamespaceA.functionName()'을 호출하는 것은'functionName()'과 완전히 다를 수 있습니다. –

+0

언급 할 가치가있는 몇 가지 다른 점은 객체를 사용한다는 것입니다. 범위가 아닙니다. 범위를 변수로 참조 할 수 없습니다. 게다가 이것은 점이있는 속성을 지원하지 않습니다. – pimvdb

0

,이 같은 뭔가 일할 수 :

var callFn = function(str, scope) { 

    scope = scope || window; 

    var namespaces = str.split('.'), 
     fn = window; // or whatever root you want 

    while(fn = fn[namespaces.shift()]){ 
     if(typeof fn == 'function') { 
      fn.call(scope); 
      return; 
     } 
    } 
}; 

예 :

window.ns = { 
    one: { 
     two: function(){ console.log('Two!') } 
    } 
}; 
window.foo = function() { 
    console.log(this); // document 
}; 

callFn('ns.one.two'); 
callFn('foo', document); 
관련 문제