Есть ли способ получить все переменные, которые в настоящее время находятся в области видимости в JavaScript?
194
Есть ли способ получить все переменные, которые в настоящее время находятся в области видимости в JavaScript?
for (v in this) alert(v);
. Однако не все глобальные перечислимы, и я не знаю ни одного стандартного способа получить список не перечислимых.this
,arguments
, параметры и все переменные , определенные в ограждающих областей.Ответы:
Нет. Переменные "в области видимости" определяются "цепочкой областей действия", которая недоступна программно.
Для деталей (довольно много), проверьте спецификацию ECMAScript (JavaScript). Вот ссылка на официальную страницу , где вы можете скачать каноническую спецификацию (а) PDF, и вот один к официальной, вулканизующемуся HTML версии.
Обновление на основе вашего комментария к Camsoft
Переменные в области видимости вашей функции события определяются тем, где вы определяете свою функцию события, а не тем, как они ее вызывают. Но вы можете найти полезную информацию о том, что доступно для вашей функции через
this
аргументы и аргументы, выполнив что-то в соответствии с тем, на что указал KennyTM (for (var propName in ____)
), так как это скажет вам, что доступно для различных предоставленных вам объектов (this
и аргументов; если вы не уверен, какие аргументы они вам дают, вы можете узнать черезarguments
переменную, которая неявно определена для каждой функции).Таким образом, в дополнение к тому, что находится в области действия, из-за того, где вы определяете свою функцию, вы можете узнать, что еще доступно другими способами, выполнив:
(Вы можете расширить это, чтобы получить больше полезной информации.)
Вместо этого, однако, я бы, вероятно, использовал отладчик, такой как инструменты разработчика Chrome (даже если вы обычно не используете Chrome для разработки) или Firebug (даже если вы обычно не используете Firefox для разработки), или Dragonfly в Opera или «Инструменты разработчика F12» в IE. И прочитайте все файлы JavaScript, которые они вам предоставляют. И бить их по голове для правильных документов. :-)
источник
Хотя все отвечают « Нет », и я знаю, что «Нет» - правильный ответ, но если вам действительно нужно получить локальные переменные функции, есть ограниченный путь.
Рассмотрим эту функцию:
Вы можете преобразовать свою функцию в строку:
Вы получите источник функции в виде строки
Теперь вы можете использовать парсер наподобие esprima для разбора кода функции и поиска объявлений локальных переменных.
и найти объекты с:
в результате (я удалил
console.log(x)
ниже):Я проверил это в Chrome, Firefox и Node.
Но проблема этого метода в том, что у вас просто есть переменные, определенные в самой функции. Например, для этого:
у вас просто есть доступ к х, а не к у . Но все же вы можете использовать цепочки вызывающего (arguments.callee.caller.caller.caller) в цикле, чтобы найти локальные переменные вызывающих функций. Если у вас есть все локальные имена переменных, значит, у вас есть переменные области видимости . С именами переменных у вас есть доступ к значениям с простым Eval.
источник
function getCounter(start){ return function(){ start ++; return start; } } var counter = getCounter(1); var startInClosure = eval.call(counter, 'this.start;'); console.log(startInClosure);
Он печатается вundefined
то время как я ожидаю, что это должно быть 2.Да и нет. «Нет» почти в каждой ситуации. «Да», но только ограниченным образом, если вы хотите проверить глобальную область. Возьмите следующий пример:
Какие выходы, среди 150+ других вещей , следующие:
Таким образом, можно перечислить некоторые переменные в текущей области видимости, но они не являются надежными, краткими, эффективными или легко доступными.
Лучший вопрос: почему вы хотите знать, какие переменные находятся в области видимости?
источник
for ( var i in window ) { if (window.hasOwnProperty(i)) { console.log(i, window[i]); }}
. Это, по крайней мере, сократит унаследованные свойства, и ваши переменные будут среди только около 50 других свойств.В ECMAScript 6 это более или менее возможно, если обернуть код внутри
with
оператора прокси-объектом. Обратите внимание, что требуется не строгий режим и это плохая практика.Прокси-сервер утверждает, что владеет всеми идентификаторами, на которые есть ссылки
with
, поэтому назначения переменных сохраняются в целевом объекте. Для поиска прокси получает значение из цели прокси или глобального объекта (не родительской области).let
иconst
переменные не включены.Вдохновленный этим ответом по Берги .
источник
Ты не можешь
Переменные, идентификаторы объявлений функций и аргументы для кода функции, связаны как свойства объекта Variable , который недоступен.
Смотрите также:
источник
with
оператор может использоваться для вставки других объектов в цепочку).Самый простой способ получить доступ к Vars в определенном объеме
Примечание: вы хотите сделать это против неунифицированного JS.
Самый простой способ показать все не частные переменные
Теперь вы увидите дерево объектов, которое вы можете расширить всеми заявленными объектами.
источник
Как все заметили: нельзя. Но вы можете создать объект и назначить каждый объявленный вами объект этому объекту. Таким образом, вы можете легко проверить свои переменные:
источник
console.log(window);
jsfiddle.net/4x3TxЯ сделал скрипку, реализуя (по существу) выше идеи, изложенные в Iman. Вот как это выглядит, когда вы наводите курсор мыши на второй ipsum в
return ipsum*ipsum - ...
Переменные, которые находятся в области видимости, подсвечиваются там, где они объявлены (разными цветами для разных областей).
lorem
С красной границы затененной переменной (не входят в комплект, но находиться в области видимости , если другой Lorem далее вниз по дереву бы там не будет.)Я использую библиотеку esprima для синтаксического анализа JavaScript и estraverse, escodegen, escope (служебные библиотеки поверх esprima). «Тяжелая работа» выполняется всеми этими библиотеками (конечно, самой сложной является сама esprima).
Как это устроено
создает абстрактное синтаксическое дерево. Затем,
генерирует сложную структуру данных, инкапсулирующую информацию обо всех областях действия программы. Остальное собирает вместе информацию, закодированную в этом объекте анализа (и само абстрактное синтаксическое дерево), и создает из него интерактивную схему раскраски.
Таким образом, правильный ответ на самом деле не «нет», а «да, но». «Но» важно: вам нужно переписать важные части браузера Chrome (и его devtools) на JavaScript. JavaScript - это полный язык Тьюринга, поэтому, конечно, это возможно в принципе. Невозможно сделать все это без использования всего исходного кода (в виде строки), а затем выполнить очень сложные вещи с этим.
источник
Если вы просто хотите проверить переменные вручную, чтобы помочь отладке, просто запустите отладчик:
debugger;
Прямо в консоль браузера.
источник