Подтвердить что ты не робот

Как проверить связанные переменные закрытия в javascript?

Предположим, что мы делаем что-то вроде этого (как часть построения объекта Javascript):

var foo = 3;
this.method = function () { alert(foo); };

Теперь будет создано замыкание, чтобы убедиться, что foo сохранен и доступен для использования в method. Есть ли способ сделать интроспекцию при текущем закрытии?

То, что я ищу, - это способ перечисления всех переменных, доступных внутри method, которые должны включать foo. Отладочный код, подобный этому, очень помог бы в отладке привязки закрытий, но я еще не нашел его. Можно ли это сделать?

4b9b3361

Ответ 1

Сам язык не содержит таких возможностей. Фактически, данные, скрытые при закрытии JavaScript, являются одной из немногих вещей, которые действительно являются действительно частными (в отличие от данных "private" на С#, С++, Java и т.д., Которые всегда можно получить с помощью волшебства или отражения указателя).

Короче говоря, это будет вещь уровня компилятора. На что можно надеяться - это инструмент, встроенный в один из основных интерпретаторов JavaScript (или, по крайней мере, встроенную возможность подключить такой инструмент к основному движку). Один из них в Firefox/Firebug или V8/ Node.js был бы приятным, но я считаю, что нам пока что не повезло.

Ответ 2

Начиная с 1.11.2, командная строка Firebug включает расширение синтаксиса для получения значения foo: this.method.%foo.

Все закрытие также можно проверить, включив опцию "Показать закрытие" на панели DOM и расширив псевдо-свойство "(закрытия)" this.method. Это также работает в Chrome (там псевдо-свойство называется <function scope>, для него нет префикса).

Ответ 3

Возможно, JavaScript не реализует его по умолчанию, но я могу представить способ чтения всех свойств из глобального объекта (поскольку foo является его собственностью) и читать каждое свойство до тех пор, пока оно не будет закрыто, хотя это будет очень медленно. Я должен сказать, что я мало что знаю о javascript, и, возможно, я просто говорю о нецензурках, но, может быть, вы получите новую идею из моего подхода.