2015-02-19 17 views
6

W debugerze JavaScript, mogę ręcznie sprawdzić scope chain funkcji. Na przykład, podczas wykonywania foo() na ten kawałek kodu:Jak programowo sprawdzić łańcuch zasięgu JavaScript?

var x1 = "global"; 
var foo = (function main() { 
    var x2 = "inside obj"; 
    return function internalFoo() { 
     var x3 = "inside internalFoo"; 
     console.log (x1+','+x2+','+x3); // get the scopes 
    }; 
})(); 
foo(); 

i ustawianie punktu przerwania na console.log, widzę następujące zakresy:

Scope Variables seen in Chrome Debugger

Czy istnieje jakiś sposób, aby zrobić to programowo?
Jak mogę sprawdzić, co jest zdefiniowane na każdym poziomie zakresu?

Odpowiedz

5

Jestem (całkiem) pewien, że nie jest to możliwe.
Nawet Chrome-debugger nie śledzi twojego zasięgu przez cały czas, ale tylko wtedy, gdy trafia w punkt przerwania. Śledzenie łańcucha zasięgu przez cały czas kosztowałoby zbyt dużo pamięci (w zależności od złożoności zamknięć i kontekstów). Aby uzyskać więcej informacji, zobacz tę funkcję funkcji: https://groups.google.com/forum/#!topic/google-chrome-developer-tools/wKEMpKjXR7s
ECMA 262 (10.3.1) opisuje sposób, w jaki należy wykonać rozpoznawanie rozdzielczości, najważniejszą częścią tego jest wywołanie GetIdentifierReference (lex, name, strict), które jest opisane w ECMA 262 (10.2.1). O ile mi wiadomo, nie ma żadnego polecenia w jakiejkolwiek implementacji ECMAScript, aby wywołać tę funkcję w czasie wykonywania.
Jednak pytanie this (a dokładniej jest to odpowiedź) może być interesujące, ponieważ przychodzi co najmniej bliżej tego, o co prosiłeś.

Powiązane problemy