2010-07-29 2 views
4

을 단순화하기 위해, 나는 동적으로 이름으로 함수를 호출하는 스크립트를 포함 한 자바 스크립트 함수의 몸체를 구현 :동적으로 명명하고

var foo = "hello"; 
var bar = "world"; 
var function_name = "say_" + foo + bar; 

// Since its name is being dynamically generated, always ensure your function actually exists 
if (typeof(window[function_name]) === "function") 
{ 
    window[function_name](" World!"); 
} 
else 
{ 
    throw("Error. Function " + function_name + " does not exist."); 
} 

function say_helloworld(the_word) 
{ 
    alert("Hello " + the_word); 
} 

그러나 기능 say_helloworld의 코드가 작성되어 정적 패션. 나는 다음과 같은 것을 원한다 :

var function_implementation = 'function say_'+foo+bar+ 
    '(the_world){alert("Hello " + the_world);}'; 
eval(function_implementation); 

eval()을 사용하지 않고. 더 이상한 접근법이 있습니다 : AJAX 호출을 통해 함수를 얻습니다.

더 나은 접근 방법을 찾을 수 있습니까?

window['say_'+foo+bar]= function(the_world) { 
    alert('Hello '+the_world); 
}; 

그러나, 동적라는 이름의 변수를 사용하는 좋은 이유가 거의 결코 :

답변

5

당신은 인라인 함수 식을 사용할 수 있습니다. 대신 별도의 조회 객체에 저장 기능 :

var says= { 
    helloworld: function(the_world) { 
     alert('Hello '+the_world); 
    }, 
    somethingelse: function(otherthing) { 
     alert('Something else with '+otherthing); 
    } 
}; 
says[somevar]('potatoes'); 
+0

우수 답변, 감사합니다! –

1

당신이 eval없이 동적 기능을 생성 할 경우 생성자

Function([arg1[, arg2[, ... argN]],] functionBody) 

당신이

var func = new Function('message', 'alert("Hello, " + message);') 
func('world!'); 
같은 물건을 할 수있는이 방법을 사용할 수 있습니다

자세한 내용은 MDC을 참조하십시오.

건배

: 나는 전에이 방법을 사용한 적이 내가 이전 기능() 생성자를 사용하지 않았다. 그래서 이것이 다른 단점이 있을지 모르겠습니다.

+0

흥미 롭습니다. 다른 렌더링 엔진과도 잘 작동합니까? –

+1

@altvali Javascript 1.5의 기본이되는 ECMA-262 3rd edition (http://www.ecma-international.org/publications/standards/ecma-262.htm)에 포함되어 있습니다. Wikipedia (http://en.wikipedia.org/wiki/JavaScript#Versions)에 따르면 IE5.5조차도이를 이해해야합니다. – moxn

1

당신은 당신의 코드를 해석하는 제한 시간을 사용할 수 있지만, 당신이 원하는 경우 내부적으로 그렇게 확신하지 평가 후면을 사용하고있을 수 있습니다 ..

fText = 'function test(a){alert(a);}'; 
setTimeout(fText,0); 

하지만 당신이 그것을 호출하기 전에 몇 밀리 초를 허용해야 ..