Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Переменные в скрипте (https://javascript.ru/forum/dom-window/49879-peremennye-v-skripte.html)

vvkk 01.09.2014 21:36

Переменные в скрипте
 
В скрипте есть переменные. Именно переменные а не свойства обекта Window. Как узнать какие есть переменные в скрипте?

MallSerg 01.09.2014 22:51

Любой JS код выполняется в определенном контексте у каждого контекста есть свой скоп переменных скопы могут быть вложенными.
От текущего контекста зависит текущий скоп а следовательно текущие переменные. Получить скоп из JS невозможно зато его видно в отладчике
Я не думаю что эта информация тебе сильно поможет =).
https://www.google.ru/webhp?sourceid...Script%20scope

vvkk 02.09.2014 10:30

Как работает код в JS я знаю. Есть тот кто сможет обьяснить как получить переменные в скрипте?

Aetae 02.09.2014 10:36

Брутфорсом. Или .toString(), а потом распарсить javascript парсером написанным на javascript.(если погуглить - наверняка и такое извращение найдётся.) Или глазами посмотреть в код.
В данной операции нет никакого практического смысла и языком она не предусмотрена.

kostyanet 02.09.2014 11:30

Глазами смотрят код и юзают увиденные переменные. Это когда под Greasemonley пишешь какого-нить грабителя - так все и происходит. Потому что если даже какие-то переменные найти - что это даст если вы не знаете заранее к чему они вообще там созданы.

MallSerg 02.09.2014 13:50

Писец
Цитата:

у: Получить скоп невозможно
Цитата:

x: Как работает я знаю
x: Как получить переменные в скрипте?

vvkk 02.09.2014 14:50

В ранних версиях Firefox получить скоп можно. Почемы вы решили что я хочу получить эти переменные именно через скоп?

MallSerg 02.09.2014 15:30

Наверно открою великую тайну из начала любого учебника по JavaScript
но переменные в JS хранятся только в объектах и ни где кроме объектов.
Если на объект нет ссылки то он удаляется сборщиком мусора.

т.е. специально для тех кто знает:
1. var создает переменную в текущем скопе и нигде более
2. объект где хранятся переменные называется скопом
3. любое обращение к переменной объявленной через var это поиск ее в текущем скопе а затем в вышестоящих скопах

как только удаляется ссылка на скоп скоп удаляется из памяти вместе со всеми переменными
Ссылка на скоп вызывает(называется) замыкание.

vvkk 02.09.2014 16:20

Почему вы решили что я хочу получить эти переменные именно через скоп?
Мне не нужны значения этих переменных. Мне нужно определить существуют ли они или нет.

Aetae 02.09.2014 18:00

Это противоречит тому что написано выше.
Проверяются они, очевидно, так typeof someVar !== 'undefined';

vvkk 02.09.2014 18:17

В скрипте есть переменные. Именно переменные а не свойства обекта Window. Как узнать какие есть переменные в скрипте?

Мне не нужны значения этих переменных, мне нужно узнать существание таких переменных в скрипте. Причем здесь скоп вообще если я незнаю названия переменых даже, да и получать значения этих переменных мне не нужно.

Да я понимаю что так проверяються typeof someVar !== 'undefined'; на существование но мне нужно название самой переменной. Как мне ее получить? Брутфорс не вариант.

Aetae 02.09.2014 18:25

См. выше. Есть ещё вариант анализа строкового представления функции.( arguments.callee.toString() ). Только вот учесть все ситуации будет не просто(возможно это чуток упростит задачу).
И всё равно - то что вы делаете бред. Опишите реальную задачу, и вам предложат нормальный вариант её решения.

vvkk 02.09.2014 18:38

Мне интересен именно этот контект решения задачи. Если его расширить то понятное дело появляються другие варианты к чему зацепиться и по другому все сделать. Необходимо решить задачу именно в этом контексте.

arguments.callee.toString() также исключено так переменные могут находиться вне функции но как я уже говорил они не являються свойствами обекта window.

Aetae 02.09.2014 18:48

В глобале они не могут не быть свойством window:
var a = 1;
alert(window.a)
(за исключениме случая strict но там и arguments.callee работать не будет).

Если же функция не первая в цепочке - можно до победного использовать arguments.callee.caller.

MallSerg 08.09.2014 15:42

Цитата:

Сообщение от Aetae
Только вот учесть все ситуации будет не просто

гарантированно невозможно;
<!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>

skrudjmakdak 08.09.2014 16:08

давайте попробуем ответить на простой вопрос, сколько здесь переменных?
<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>

Aetae 08.09.2014 16:43

MallSerg, строки просто вырезать(смотри ссылку на функцию kobezzza ), eval - обработать особо.

skrudjmakdak, всё это можно учесть в парсере: вырезать вложенные функции, учесть надстоящие...)

И вообще, всё это - возможно. В крайнем случае можно бинарно распарсить js движком js портированым на asm.js.:D

skrudjmakdak 08.09.2014 16:48

Aetae,
ладно, если можно. стоит ли оно того времени и сил? и вообще зачем все это?

MallSerg 08.09.2014 17:04

Цитата:

Сообщение от MallSerg
гарантированно невозможно;

т.е. Гарантированно возможно - при наличии астрономических вычислительных ресурсах и пары трилионов лет но имхо это называется невозможно.

Пришло в голову что было бы неплохо если бы в JS была возможность перегрузки оператора var

Aetae 08.09.2014 18:10

MallSerg, ты преувеличиваешь. Нормально будет работать, даж без особых лагов. Asm.js потому и называется asm что обеспечивает достаточную скорость.)

skrudjmakdak, конечно нет. Это лютый бред, но мир полон бреда: одним больше - одним меньше.)


Часовой пояс GMT +3, время: 08:27.