2013-04-09 4 views
1

eval()을 사용하지 않고 다음 작업을 수행 할 수 있습니까?개체 이름이 문자열 인 경우 개체 이름이 정의되어 있는지 확인하십시오.

다음 함수는 문자열이 객체 이름 인 문자열 배열을 허용합니다. 나는 그들 중 어느 것도 정의되지 않았 음을 보장하기 위해 반복한다.

alert(hasMissingDependencies(['App.FooObject', 'App.BarObject'])); 

내가 선호하는 것 :이와 eval()

function hasMissingDependencies(dependencies) { 
    var missingDependencies = []; 

    for (var i = 0; i < dependencies.length; i++) { 
     if (eval('typeof ' + dependencies[i]) === 'undefined') { 
      missingDependencies.push(dependencies[i]); 
     } 
    } 

    if (missingDependencies.length > 0) { 
     return true; 
    } 

    return false; 
} 

를 사용하지 않고이 작업을 수행 할 수 있도록하고 싶습니다, 나는 다음과 같이 뭔가를 통과하고 내가 원하는 것을 얻을 수 있어요 eval()을 사용하지 않지만 객체 이름이 문자열로 전달 될 때 객체가 정의되지 않았는지 확인하는 다른 방법을 찾지 못했습니다.

+0

왜 문자열로 전달해야합니까? –

+0

** 다른 기능으로 정의되지 않은 ** 개체 이름을 전달하는 다른 방법을 알지 못합니다. 예를 들어, 'hasMissingDependencies (App.FooObject, App.BarObject)'를 호출하면 두 객체 중 하나가 정의되지 않은 경우 오류가 발생합니다. 내가 놓친 게 있니? – Jared

+0

어디에서 전달하고 있습니까? 가능한 해결책에 대한 내 대답을 볼 수 있지만 전달하기 전에 존재하는지 확인한 다음 그렇지 않으면 null 또는 다른 값을 전달하는 것이 훨씬 간단합니다. –

답변

5

테스트 할 것입니다 :

당신은 그 변수를 얻을 수있는 간단한 기능을 구축 할 수 있습니다), 마침표로 분리하고 대괄호 표기법을 사용할 수 있습니다. 당신이 requireJS 교체를 작성하려고하지 않는 한,이 거의 항상하지만 나쁜 생각이라고

function isDefined(name, obj){ 
    if(!obj){ 
     obj = window; 
    } 
    var pathArr = name.split("."); 
    obj = obj[pathArr.splice(0,1)]; 
    if(typeof obj !== undefined){ 

    return pathArr.length ? isDefined(pathArr.join("."),obj): true; 
    } 

    return false; 


} 

주와 같은

뭔가. 함수를 호출하는 컨텍스트에 값이 있는지 확인한 다음 값이 존재하면 값을 전달하거나 그렇지 않으면 null/undefined/some default 값을 전달하십시오. 전달 컨텍스트를 제어하지 않으면 개체를 요청한 다음 개체가 정의되어 있는지 확인하십시오.

+0

주목. 도와 주셔서 감사합니다. 이 답변을 따르기가 가장 쉽기 때문에이 답변을 승인 된 것으로 표시 하겠지만,이 스레드를 사용하는 모든 사용자는 답변을 @dystroy에서보다 간결한 버전으로 볼 것을 권장합니다. – Jared

2

배열에 이름이있는 전역 변수가 정의되어 있는지 확인하는 것이 좋습니다.

function getVar(name) { 
    var v = window, path=name.split('.'); 
    while (path.length>0 && v) v = v[path.shift()]; 
    return v; 
} 

이러한 글로벌 변수 (IE는 내부 기능의 범위 내에서 정의되지 않은 것을 가정

if (typeof getVar(dependencies[i]) === 'undefined') 
+1

.하지만 네임 스페이스를 사용하는 그의 예제에서는 작동하지 않습니다. window [ 'App.FooObject']는 App.FooObject가 존재하더라도 정의되지 않은 값을 반환합니다. –

+1

@ ben336 요구 사항을 이해하지 못했습니다. 나는 더 나은 지금은 –

+2

옙, 내 버전보다 깨끗한 것 같아요. Upvoted. 대답에 언급 할 가치가 있지만 대개 좋은 생각이 아닙니다. –

관련 문제