2012-02-02 6 views
3

그래, How to turn a String into a javascript function call? 또는 How to execute a JavaScript function when I have its name as a string과 같은 수많은 질문이 있습니다.문자열을 자바 스크립트 함수 호출로 변환하는 방법 (객체가있는 경우)

그러나 우리가 평범한 함수 이름을 가지고 있지는 않지만 사실상 함수 인 객체 속성 이름이 있다면?

처럼 :

var callMe = 'foo.bar.baz'; 

및 호출 할 것으로 예상되는 코드는 다음과 같습니다

window.foo = { 
    bar: { 
     baz: function() { 
      alert('Eureka!'); 
     } 
    } 
}; 

나는이 필요한 이유 : 콜백 매개 변수가 URL을 통해 전달하고 (응용 프로그램 설계에 의해) 될 수 있습니다 함수 이름 또는 객체의 속성에 대한 FQN.

eval() 이외의 아이디어가 있습니까?

UPD :

내 최종 구현이 당신을 위해 작동하는 경우

var parts = callbackName.split('.'), 
    callback; 

for (i in parts) { 
    if (!callback) { 
     callback = window[parts[i]]; 
    } else { 
     callback = callback[parts[i]]; 
    } 

    if (typeof callback === 'undefined') break; 
} 

if (typeof callback === 'function') { 
    callback(); 
} else { 
    console.error('Passed callback is not a valid function'); 
} 

답변

5

그에 'foo.bar.baz' 번역하기 쉬워야한다,

window['foo']['bar']['baz']() 

을 시도합니다.

+0

그래, 너무 뻔했다. -S – zerkms

+2

당신은 언제나 셜록 홈즈 이야기와 관련이있다. 스코틀랜드 야드는 집에서 편지를 보며 찾을 수없는 곳이다. 그들은 연구에서 책상으로 걸어 가서 그 위에 누워있는 봉투를 골랐던 Holmes를 데려왔다. 그게 편지 였어. –

0

이 아마이 일의 가장 우아한 방법은 아니지만 작동합니다 : (http://jsfiddle.net/bxsHp/를)

var callMe = "foo.bar.baz".split('.'); 

var callMeParts = callMe.split('.'); 

var fnCallMe = null; 
var obj = window; 
for (var i = 0; i < callMeParts.length; i++) { 
    var prop = callMeParts[i]; 
    if (typeof obj[prop] === 'undefined') break; 

    if ((i + 1) === callMeParts.length && typeof obj[prop] === 'function') { 
     fnCallMe = obj[prop]; 
     break; 
    } 
    obj = obj[prop]; 
} 

if (fnCallMe !== null) { 
    fnCallMe.call(obj); // Call the function using the function container as the "scope" 
} 
1

코드를 아래를 참조하고 바이올린을 체크 아웃 :

window.foo = { 
    bar: { 
     baz: function() { 
      alert('Eureka!'); 
     } 
    } 
}; 
//foo.bar.baz(); 
var callme = "foo.bar.baz"; 
var fn = window[callme.split(".")[0]];//get the first prop. bar 
var len = callme.split(".").length;//length of obj tree 
for(i=1;i < len;i++) 
{//search for the next obj 
    fn = fn[callme.split(".")[i]]; 
} 
if(typeof(fn) == "function") 
{//check and call 
    fn(); 
} 
1

당신은 할 수 항상 reduce()을 사용하십시오.

callMe.split('.').reduce(function(prev, value) { 
    return prev[value] || function() {}; 
}, window)(); 

jsFiddle.

|| function() {}은 개체/기능 목록이 undefined 인 경우 오류를 방지하기위한 것입니다. jQuery를 사용하는 경우 빈 함수 리터럴을 $.noop()으로 바꿀 수 있습니다.

물론 이전 IE를 지원하면 shimArray.prototype.reduce()이 필요합니다.

관련 문제