- PVSM.RU - https://www.pvsm.ru -

Короткая JS-задачка для понедельника

image

Которая родилась в процессе изучения кошмаров 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

Источник [1]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/321126

Ссылки в тексте:

[1] Источник: https://habr.com/ru/post/456436/?utm_campaign=456436&utm_source=habrahabr&utm_medium=rss