Переменные в скрипте
В скрипте есть переменные. Именно переменные а не свойства обекта Window. Как узнать какие есть переменные в скрипте?
|
Любой JS код выполняется в определенном контексте у каждого контекста есть свой скоп переменных скопы могут быть вложенными.
От текущего контекста зависит текущий скоп а следовательно текущие переменные. Получить скоп из JS невозможно зато его видно в отладчике Я не думаю что эта информация тебе сильно поможет =). https://www.google.ru/webhp?sourceid...Script%20scope |
Как работает код в JS я знаю. Есть тот кто сможет обьяснить как получить переменные в скрипте?
|
Брутфорсом. Или .toString(), а потом распарсить javascript парсером написанным на javascript.(если погуглить - наверняка и такое извращение найдётся.) Или глазами посмотреть в код.
В данной операции нет никакого практического смысла и языком она не предусмотрена. |
Глазами смотрят код и юзают увиденные переменные. Это когда под Greasemonley пишешь какого-нить грабителя - так все и происходит. Потому что если даже какие-то переменные найти - что это даст если вы не знаете заранее к чему они вообще там созданы.
|
Писец
Цитата:
Цитата:
|
В ранних версиях Firefox получить скоп можно. Почемы вы решили что я хочу получить эти переменные именно через скоп?
|
Наверно открою великую тайну из начала любого учебника по JavaScript
но переменные в JS хранятся только в объектах и ни где кроме объектов. Если на объект нет ссылки то он удаляется сборщиком мусора. т.е. специально для тех кто знает: 1. var создает переменную в текущем скопе и нигде более 2. объект где хранятся переменные называется скопом 3. любое обращение к переменной объявленной через var это поиск ее в текущем скопе а затем в вышестоящих скопах как только удаляется ссылка на скоп скоп удаляется из памяти вместе со всеми переменными Ссылка на скоп вызывает(называется) замыкание. |
Почему вы решили что я хочу получить эти переменные именно через скоп?
Мне не нужны значения этих переменных. Мне нужно определить существуют ли они или нет. |
Это противоречит тому что написано выше.
Проверяются они, очевидно, так typeof someVar !== 'undefined'; |
В скрипте есть переменные. Именно переменные а не свойства обекта Window. Как узнать какие есть переменные в скрипте?
Мне не нужны значения этих переменных, мне нужно узнать существание таких переменных в скрипте. Причем здесь скоп вообще если я незнаю названия переменых даже, да и получать значения этих переменных мне не нужно. Да я понимаю что так проверяються typeof someVar !== 'undefined'; на существование но мне нужно название самой переменной. Как мне ее получить? Брутфорс не вариант. |
См. выше. Есть ещё вариант анализа строкового представления функции.( arguments.callee.toString() ). Только вот учесть все ситуации будет не просто(возможно это чуток упростит задачу).
И всё равно - то что вы делаете бред. Опишите реальную задачу, и вам предложат нормальный вариант её решения. |
Мне интересен именно этот контект решения задачи. Если его расширить то понятное дело появляються другие варианты к чему зацепиться и по другому все сделать. Необходимо решить задачу именно в этом контексте.
arguments.callee.toString() также исключено так переменные могут находиться вне функции но как я уже говорил они не являються свойствами обекта window. |
В глобале они не могут не быть свойством window:
var a = 1; alert(window.a)(за исключениме случая strict но там и arguments.callee работать не будет). Если же функция не первая в цепочке - можно до победного использовать arguments.callee.caller. |
Цитата:
<!Doctype html> <html> <head> <meta charset="utf-8"> </head> <body> <input type="button" onclick="alert ( fun())" value="кнопка"/> <script type="text/javascript"> function fun(){ function r(x){return Math.floor((Math.random()*x))} var str = ""; for (i=0 ;i < r(2000);i++ ){ str?str+=",":0; for (ii=0;ii < r(100);ii++){ str += "QWERTYUIOPASDFGHJKL"[r(19)];}} var arr=str.split(","); str=""; for (i=0;i<arr.length;i++){ str += "var "+arr[i]+"="+i+"; "; } return str; } </script> </body> </html> |
давайте попробуем ответить на простой вопрос, сколько здесь переменных?
<html> <html> <head> </head> <body> <script> var x = 1; function one () { var x = 2; console.log(x); } function two () { var x = 3; console.log(x); } one(); two() console.log(x); </script> </body> </html> |
MallSerg, строки просто вырезать(смотри ссылку на функцию kobezzza ), eval - обработать особо.
skrudjmakdak, всё это можно учесть в парсере: вырезать вложенные функции, учесть надстоящие...) И вообще, всё это - возможно. В крайнем случае можно бинарно распарсить js движком js портированым на asm.js.:D ![]() |
Aetae,
ладно, если можно. стоит ли оно того времени и сил? и вообще зачем все это? |
Цитата:
Пришло в голову что было бы неплохо если бы в JS была возможность перегрузки оператора var |
MallSerg, ты преувеличиваешь. Нормально будет работать, даж без особых лагов. Asm.js потому и называется asm что обеспечивает достаточную скорость.)
skrudjmakdak, конечно нет. Это лютый бред, но мир полон бреда: одним больше - одним меньше.) |
Часовой пояс GMT +3, время: 01:36. |