2010-08-19 2 views
4

질문에서 알 수 있듯이 - 현재 네임 스페이스에 선언 된 모든 변수의 이름을 가져올 수 있습니까? 예를 들어,이 같은 :자바 스크립트 : 현재 네임 스페이스의 내용을 가져올 수 있습니까?

 
>>> var x = 42; 
>>> function bar() { ...} 
>>> getNamespace() 
{ x: 42, bar: function(){} } 
>>> 
+2

다른 문언으로 표시되었지만 http://stackoverflow.com/questions/2051678/getting-all-variables-in-scope가 중복되었습니다. – syockit

답변

0
function listMembers (obj) { 
    for (var key in obj) { 
     console.log(key + ': ' + obj[key]); 
    } 
} 

// get members for current scope 
listMembers(this);

전역 범위 (예를 들면 window 객체입니다.)에 있다면 이것은 약간의 털이를 얻을 수 있습니다. 또한 내장형 및 프로토 타입 방식을 반환합니다. 당신은 이것을 억제 할 수

  1. propertyIsEnumerable() 또는 delete에 재산을 시도
  2. hasOwnProperty()를 사용
  3. 스트리핑 회원 여러분에게 (true은 대부분 내장,이 불규칙 할 수 있지만 사용자가 만든, false 수단을 의미한다) 다른 필터링 배열을 통해 원하지 않는다는 것을 알고 있습니다.
+0

불행히도 이것은 작동하지 않습니다. 다음을 고려하십시오 :'function foo() {var bar = 42; listMembers (this); }'-이 경우'this'는'bar'의 정의와 전혀 관련이 없습니다. –

2

대부분의 구현에서는 불가능합니다. Rhino에서는 __parent__을 통해 활성화 객체에 접근 할 수 있습니다.

js> function f(){ var x,y=1; return (function(){}).__parent__ } 
js> uneval([v for(v in Iterator(f()))]) 
[["arguments", {}], ["x", , ], ["y", 1]] 

자세한 내용은 http://dmitrysoshnikov.com/ecmascript/chapter-2-variable-object/을 참조하십시오.

-1

이 같은 현재의 기능 범위의 소스를 얻을 수 있습니다 :

그래서
arguments.callee.toString() 

나는 "VAR"다음에서 "때까지 일치"기능 ", 같은 것들을 일치, 당신이 문자열을 구문 분석 할 수 있다고 가정 ; " 또는 "}"

하지만 매우 지저분하고 짐승 같은 접근 방식이 될 것입니다. 이런 종류의 정보를 정말로 필요로한다면, 변수를 전혀 생성하지 않는 것이 낫습니다. 모든 값과 함수를 객체 프로퍼티로 정의하면, (key in obj)

으로 간단히 반복 할 수 있습니다.
+1

이 함수는 호출하는 함수의 소스 코드를 반환하지만 네임 스페이스를 반환하지는 않습니다. –

관련 문제