Которая родилась в процессе изучения кошмаров LexicalEnvironment и вообще ликбеза на тему "Почему оно работает так".
Задача получилась действительно из серии wtfjs, но после внимательного рассмотрения — полностью укладывается в логику работы языка.
Итак, сразу к делу:
Есть модуль module.js
:
// module.js
function getRandomNumber() {
return Math.floor(Math.random() * 100)
}
var a = 10;
function b() {
a = 100;
return;
function a() {}
}
b();
module.exports = getModule();
async function getModule() {
return {
a,
get getterA() {
return a
},
x: ++a + ++a,
rndA: a + getRandomNumber(),
getA: function() { return this.a },
getArrowA: () => this.a,
getRndA: () => a + getRandomNumber()
}
}
Он вызывается из файла index.js:
// index.js
a = 5;
(async () => {
let moduleObj1 = await require("./module")
let moduleObj2 = await require("./module")
console.log(
`
============================
m1Obj.a: | ${moduleObj1.a}
m1Obj.getterA: | ${moduleObj1.getterA}
m1Obj.x: | ${moduleObj1.x}
m1Obj.getA: | ${moduleObj1.getA()}
m1Obj.getArrowA: | ${moduleObj1.getArrowA()}
m1Obj.rndA: | ${moduleObj1.rndA}
m1Obj.getRndA: | ${moduleObj1.getRndA()}
============================
m2Obj.a: | ${moduleObj2.a}
m2Obj.getterA: | ${moduleObj2.getterA}
m2Obj.x: | ${moduleObj2.x}
m2Obj.getA: | ${moduleObj2.getA()}
m2Obj.getArrowA: | ${moduleObj2.getArrowA()}
m2Obj.rndA: | ${moduleObj2.rndA}
m2Obj.getRndA: | ${moduleObj2.getRndA()}
============================
a: | ${a}
============================`
)
})()
Собственно, вопрос: что будет выведено в консоль?
Ответ:
============================
m1Obj.a: | 10
m1Obj.getterA: | 12
m1Obj.x: | 23
m1Obj.getA: | 10
m1Obj.getArrowA: | 5
m1Obj.rndA: | рандомное число от 12 до 111
m1Obj.getRndA: | рандомное число от 12 до 111
============================
m2Obj.a: | 10
m2Obj.getterA: | 12
m2Obj.x: | 23
m2Obj.getA: | 10
m2Obj.getArrowA: | 5
m2Obj.rndA: | рандомное число от 12 до 111
m2Obj.getRndA: | рандомное число от 12 до 111
============================
a: | 5
============================
Автор: vladbarcelo