@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 не проверяет достижимость.
В третьих вообще не понятно для чего вам необходимо функциям прописывать поля со значением.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы