Как проверить связанные переменные замыкания в JavaScript? - PullRequest
23 голосов
/ 31 января 2011

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 31 января 2011

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

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

8 голосов
/ 17 апреля 2013

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

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

0 голосов
/ 29 мая 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...