@sanex3339

Почему такое поведение js кода?

Делаю алгоритм трансформации AST нод типа functionDeclaration и functionExpression.
Алгоритм является частью обфускатора JS кода, который берет на вход любой JS код и трансформирует его множеством способов. Конечная цель - максимально усложнить понимание кода.

Приведенные ниже 2 куса кода - исходный код до и после работы алгоритма.

Алгоритм трансформирует код вида:
function foo () {
	function bar () {
		return 'bar';
	}

	bar.property = 'property';

	console.log('bar property is: ' + bar.property);
}

foo();


в код вида (пример упрощен, порядок case'ов будет рандомный)
function foo () {
	var controller = 1;

	loop:
	while (true) {
		switch (controller++) {
			case 1:
				function bar () {
					return 'bar';
				}
				continue loop;

			case 2:
				bar.property = 'property';
				// console.log('bar property is: ' + bar.property);
				continue loop;

			case 3:
				console.log('bar property is: ' + bar.property);
				break loop;
		}
	}
}

foo();


Мне не ясно следующее поведение:
во 2-м case'е фи-ии bar присваивается статичное св-во property. Если воткнуть туда console.log, то св-во property существует.
в 3-м case'е это св-во undefined.

Почему статичное св-во ф-ии, заданное в одном case'е, будет undefined в другом, при том, что сама ф-ия видна и в обоих case'ах?
  • Вопрос задан
  • 179 просмотров
Решения вопроса 1
@vintage
Каждый раз заходя в блок кода, интерпретатор создаёт новый экземпляр функции. Решение простое - заворачиваем создание функции в отдельный блок: https://jsbin.com/ruqefarane/edit?js,console
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Samarkand
Зачем вообще это нужно?
Ответ написан
evgeniy8705
@evgeniy8705
Повелитель вселенной
Во первых нужно более подробно и внятно объяснить в чем у вас проблема и четко поставить вопрос/вопросы.

Во вторых научитесь не мешать иностранные слова то в одном виде то в другом. Вольный перевод и ваше написание иностранного слова может быть не понято другими пользователями данного сервиса, которые заинтересовались вашим вопросом и возможно хотели вам помочь.

В третьих научитесь последовательно излагать ваши мысли и правильно ставить вопросы.
Вопрос "Почему так происходит?" многим может быть не понятен. Что именно так происходит? То что вы "Делаете алгоритм трансформации", вам это не понятно почему так происходит?

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

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

Решение вашей проблемы.
Во первых let имеет ограниченную область видимости, и не гарантируется что объявленная переменная созданная в одном месте, будет видна в другом.
Во вторых в случае если переменная controller будет равна 3, то case 2, будет являться недостижимым кодом, к сожалению интерпретатор JS не проверяет достижимость.
В третьих вообще не понятно для чего вам необходимо функциям прописывать поля со значением.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
18 апр. 2024, в 21:56
2000 руб./за проект
18 апр. 2024, в 21:00
150 руб./за проект