Делаю алгоритм трансформации 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'ах?