2008-09-02 2 views
19

파이썬에서는 내장 함수 locals()globals()을 사용하여 현재 범위에서 모든 로컬 및 전역 변수의 사전을 가져올 수 있습니다. Javascript에서 이와 동일한 작업을 수행 할 수 있습니까? 예를 들어, 나는 다음과 같은 것을 할 싶습니다Javascript는 Python의 지역 언어()와 동일합니까?

var foo = function(){ alert('foo'); }; 
var bar = function(){ alert('bar'); }; 

var s = 'foo'; 
locals()[s](); // alerts 'foo' 

이 전혀 가능을, 또는 그냥 조회에 대한 로컬 객체를 사용한다?

답변

15
  • 지역 주민() - 호

  • 전역() - 예.

window 파이썬 globals() 같은 전역에 대한 참조이다. 단지 당신이없는 지역 변수, 전역에 액세스 할 수 있습니다, 윈도우 개체를 사용

window["foo"] 
+5

* window *를 구현하는 브라우저 또는 다른 호스트 환경에서만. – RobG

+1

사실입니다. 예를 들어 Node에서이 작업을 수행 할 수있는 방법이 없습니까? 이것이 일반적인 JavaScript 응답이므로 변경해야한다고 생각합니다. – sverrejoh

+4

* window *가없는 경우 * global *이 있습니다 - http://stackoverflow.com/q/10984629/596361 –

4

글쎄, 나는 js에 그런 것이 있다고 생각하지 않는다. locals() 대신 항상 eval을 사용할 수 있습니다. 이처럼 :

eval(s+"()"); 

당신은 실제로이 존재 foo는 작동하는지 알아야합니다.

편집 :

는 평가 사용하지 마십시오 : 사용 :

var functionName="myFunctionName"; 
window[functionName](); 
+0

:

globals()["foo"] 

은 동일합니다. –

0

AFAIK를, 아니. 당신은 그냥 주어진 변수의 존재를 확인하려는 경우, 당신은 그것을 위해이 같은 테스트하여 작업을 수행 할 수 있습니다

if (foo) foo(); 
+0

변수가 정의 된 경우에만 작동하며, 그렇지 않으면 ReferenceError가 발생합니다. –

3

내가 브렌던 아이크는 최근 팟 캐스트에서이에 댓글을 기억하는 것을; 내가 올바르게 기억한다면, 최적화에 부당한 제한을 가하는 것으로 간주되지 않습니다. 그는 varargs에 유용하지만 그 존재는 그 정의를 보아서 함수가 만지는 것을 추측하는 능력을 제거한다는 점에서 로컬 인 arguments과 비교했다.

은 BTW : - a quick search이가 비록 사용되지 않습니다 보여줍니다 난 JS 한 번에 지역의 인수를 통해 지역 주민에 액세스하기위한 지원을했다 생각합니다.

0

@ e-bartek, 저는 어떤 closure에서 window [functionName]이 작동하지 않을 것이라고 생각합니다. 함수 이름은 그 closure에 국한됩니다. 예를 들어이 경우

function foo() { 
    var bar = function() { 
     alert('hello world'); 
    }; 
    var s = 'bar'; 
    window[s](); // this won't work 
} 

, S '는 바'이지만 함수 '바'는 함수 '갑'의 범위 안에 존재한다. 창 범위에 정의되어 있지 않습니다.

물론이 질문은 실제로 원래 질문에 대한 답변이 아니며, 나는이 응답에 응답하고 싶었습니다. 나는 원래의 질문에 무엇을 할 수있는 방법이 있다고 생각하지 않는다.

0

@ pkaeding

네, 그렇습니다. window [functionName] ()이 경우 작동하지 않지만 eval 않습니다. 이와 같은 것을 필요로한다면, 나는 그 기능들을 함께 유지할 수있는 자신 만의 객체를 만들 것입니다.

var func = {}; 
func.bar = ...; 
var s = "bar"; 
func[s]();