현재 자바 스크립트 범위에있는 모든 변수를 가져 오는 방법이 있습니까?
답변
“범위 내”변수는 “스코프 체인”에 의해 결정되며 프로그래밍 방식으로는 액세스 할 수 없습니다.
자세한 내용은 (아주 많이) ECMAScript (JavaScript) 사양을 확인하십시오. 여기에 링크의 당신이 표준 사양 (PDF 파일)를 다운로드 할 수있는 공식 페이지, 그리고 여기에 하나 의 공식, 링크 가능한 HTML 버전.
귀하의 의견에 따라 Camsoft로 업데이트
이벤트 함수 범위 내의 변수 는 이벤트 함수를 호출하는 방식이 아니라 이벤트 함수를 정의한 위치에 따라 결정됩니다. 그러나this KennyTM이 지적한 내용 ( for (var propName in ____))을 따라 함수를 통해 사용할 수있는 기능 과 인수에 대한 유용한 정보를 찾을 수 있습니다 this. 그들이 당신에게 어떤 인수를 제공하는지 확실하지 않으면 arguments모든 함수에 대해 암시 적으로 정의 된 변수를 통해 찾을 수 있습니다 ).
따라서 함수를 정의하는 위치로 인해 범위 내에있는 것 외에도 다음을 수행하여 다른 방법으로 사용 가능한 다른 것을 찾을 수 있습니다.
var n, arg, name;
alert("typeof this = " + typeof this);
for (name in this) {
alert("this[" + name + "]=" + this[name]);
}
for (n = 0; n < arguments.length; ++n) {
arg = arguments[n];
alert("typeof arguments[" + n + "] = " + typeof arg);
for (name in arg) {
alert("arguments[" + n + "][" + name + "]=" + arg[name]);
}
}
더 유용한 정보를 얻기 위해 확장 할 수 있습니다.
그 대신 Chrome 개발 도구 (일반적으로 개발에 Chrome을 사용하지 않는 경우에도) 또는 Firebug (일반적으로 개발에 Firefox를 사용하지 않는 경우에도 ) 또는 Opera의 Dragonfly 와 같은 디버거를 사용합니다 또는 IE의 “F12 개발자 도구” 그들이 제공하는 JavaScript 파일을 읽어보십시오. 그리고 적절한 문서를 위해 머리 위로 두들겨보십시오. 🙂
답변
모두가 ” 아니오 “라고 대답하고 ” 아니오 “가 정답이라는 것을 알고 있지만 실제로 함수의 로컬 변수 를 가져와야하는 경우에는 제한적인 방법이 있습니다.
이 기능을 고려하십시오.
var f = function() {
var x = 0;
console.log(x);
};
함수를 문자열로 변환 할 수 있습니다.
var s = f + '';
함수 소스를 문자열로 얻습니다.
'function () {\nvar x = 0;\nconsole.log(x);\n}'
이제 esprima 와 같은 구문 분석기를 사용하여 함수 코드를 구문 분석하고 로컬 변수 선언을 찾을 수 있습니다.
var s = 'function () {\nvar x = 0;\nconsole.log(x);\n}';
s = s.slice(12); // to remove "function () "
var esprima = require('esprima');
var result = esprima.parse(s);
다음을 사용하여 객체를 찾으십시오.
obj.type == "VariableDeclaration"
결과 ( console.log(x)아래에서 제거했습니다 ) :
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "x"
},
"init": {
"type": "Literal",
"value": 0,
"raw": "0"
}
}
],
"kind": "var"
}
]
}
Chrome, Firefox 및 Node에서 이것을 테스트했습니다.
그러나이 방법 의 문제점 은 함수 자체에 변수가 정의되어 있다는 것입니다. 예를 들면 다음과 같습니다.
var g = function() {
var y = 0;
var f = function() {
var x = 0;
console.log(x);
};
}
y가 아닌 x에 액세스 할 수 있습니다 . 그러나 여전히 호출자 체인 (arguments.callee.caller.caller.caller)을 루프에서 사용하여 호출자 함수의 로컬 변수를 찾을 수 있습니다. 로컬 변수 이름이 모두 있으면 범위 변수가 있습니다. 변수 이름을 사용하면 간단한 평가를 통해 값에 액세스 할 수 있습니다.
답변
예, 아니오 거의 모든 상황에서 “아니오”. 전역 범위를 확인하려는 경우 제한적인 방식으로 만 “예”를 사용하십시오. 다음 예를 보자.
var a = 1, b = 2, c = 3;
for ( var i in window ) {
console.log(i, typeof window[i], window[i]);
}
어떤 출력 150 + 다른 것들 사이에 , 다음과 같은 :
getInterface function getInterface()
i string i // <- there it is!
c number 3
b number 2
a number 1 // <- and another
_firebug object Object firebug=1.4.5 element=div#_firebugConsole
"Firebug command line does not support '$0'"
"Firebug command line does not support '$1'"
_FirebugCommandLine object Object
hasDuplicate boolean false
따라서 현재 범위에서 일부 변수를 나열 할 수 있지만 신뢰할 수 있고 간결하거나 효율적이거나 쉽게 액세스 할 수있는 것은 아닙니다.
더 좋은 질문은 왜 어떤 변수가 범위 내에 있는지 알고 싶습니까?
답변
ECMAScript 6에서는 코드를 with프록시 객체 로 명령문 내부에 배치하여 어느 정도 가능 합니다. 엄격하지 않은 모드가 필요하고 나쁜 습관입니다.
function storeVars(target) {
return new Proxy(target, {
has(target, prop) { return true; },
get(target, prop) { return (prop in target ? target : window)[prop]; }
});
}
var vars = {}; // Outer variable, not stored.
with(storeVars(vars)) {
var a = 1; // Stored in vars
var b = 2; // Stored in vars
(function() {
var c = 3; // Inner variable, not stored.
})();
}
console.log(vars);
프록시는 내부 with에서 참조 된 모든 식별자를 소유한다고 주장 하므로 변수 할당이 대상에 저장됩니다. 조회의 경우 프록시는 프록시 대상 또는 전역 개체 (부모 범위가 아닌)에서 값을 검색합니다. let및 const변수는 포함되어 있지 않습니다.
답변
답변
특정 범위에서 Var에 액세스하는 가장 간단한 방법
- 개발자 도구> 리소스 (Chrome)를 엽니 다.
- 해당 범위에 액세스 할 수있는 기능으로 파일 열기 (파일을 찾으려면 cmd / ctrl + p 팁)
- 해당 함수 내에 중단 점을 설정하고 코드를 실행하십시오.
- 중단 점에서 중지되면 콘솔 (또는 범위 var 창)을 통해 범위 var에 액세스 할 수 있습니다.
참고 : 축소되지 않은 js에 대해이 작업을 수행하려고합니다.
모든 비 개인 전용 변수를 표시하는 가장 간단한 방법
- 콘솔 열기 (Chrome)
- 유형 : this.window
- 엔터
이제 선언 된 모든 객체로 확장 할 수있는 객체 트리가 표시됩니다.
답변
모두가 알다시피 : 당신은 할 수 없습니다. 그러나 obj를 만들고 선언 한 모든 var를 해당 obj에 할당 할 수 있습니다. 이렇게하면 var를 쉽게 확인할 수 있습니다.
var v = {}; //put everything here
var f = function(a, b){//do something
}; v.f = f; //make's easy to debug
var a = [1,2,3];
v.a = a;
var x = 'x';
v.x = x; //so on...
console.log(v); //it's all there
