질문에서 알 수 있듯이 - 현재 네임 스페이스에 선언 된 모든 변수의 이름을 가져올 수 있습니까? 예를 들어,이 같은 :자바 스크립트 : 현재 네임 스페이스의 내용을 가져올 수 있습니까?
>>> var x = 42; >>> function bar() { ...} >>> getNamespace() { x: 42, bar: function(){} } >>>
질문에서 알 수 있듯이 - 현재 네임 스페이스에 선언 된 모든 변수의 이름을 가져올 수 있습니까? 예를 들어,이 같은 :자바 스크립트 : 현재 네임 스페이스의 내용을 가져올 수 있습니까?
>>> var x = 42; >>> function bar() { ...} >>> getNamespace() { x: 42, bar: function(){} } >>>
function listMembers (obj) {
for (var key in obj) {
console.log(key + ': ' + obj[key]);
}
}
// get members for current scope
listMembers(this);
전역 범위 (예를 들면 window
객체입니다.)에 있다면 이것은 약간의 털이를 얻을 수 있습니다. 또한 내장형 및 프로토 타입 방식을 반환합니다. 당신은 이것을 억제 할 수
propertyIsEnumerable()
또는 delete
에 재산을 시도hasOwnProperty()
를 사용true
은 대부분 내장,이 불규칙 할 수 있지만 사용자가 만든, false
수단을 의미한다) 다른 필터링 배열을 통해 원하지 않는다는 것을 알고 있습니다.불행히도 이것은 작동하지 않습니다. 다음을 고려하십시오 :'function foo() {var bar = 42; listMembers (this); }'-이 경우'this'는'bar'의 정의와 전혀 관련이 없습니다. –
대부분의 구현에서는 불가능합니다. 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/을 참조하십시오.
이 같은 현재의 기능 범위의 소스를 얻을 수 있습니다 :
그래서arguments.callee.toString()
나는 "VAR"다음에서 "때까지 일치"기능 ", 같은 것들을 일치, 당신이 문자열을 구문 분석 할 수 있다고 가정 ; " 또는 "}"
하지만 매우 지저분하고 짐승 같은 접근 방식이 될 것입니다. 이런 종류의 정보를 정말로 필요로한다면, 변수를 전혀 생성하지 않는 것이 낫습니다. 모든 값과 함수를 객체 프로퍼티로 정의하면, (key in obj)
으로 간단히 반복 할 수 있습니다.이 함수는 호출하는 함수의 소스 코드를 반환하지만 네임 스페이스를 반환하지는 않습니다. –
다른 문언으로 표시되었지만 http://stackoverflow.com/questions/2051678/getting-all-variables-in-scope가 중복되었습니다. – syockit