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
    ============================

Комментарии (4)


  1. Anshi85
    17.06.2019 16:26

    Честно в понедельник вечером думать вообще не хочется)

    P.S. минусы не я вам ставил.


  1. Aingis
    17.06.2019 16:26

    Если в ответе под спойлером «рандомное число от 1 до 100», а в решении «рандомное число от 12 до 111», то это подходит под пункт «решил, ответ сошёлся», потому что ответ неправильный? Или это пункт «Решил, ответ сошёлся не полностью»?


    1. vladbarcelo Автор
      17.06.2019 16:35

      Пардон, поправил.


  1. Mikluho
    17.06.2019 17:28
    +1

    после внимательного рассмотрения — полностью укладывается в логику работы языка.
    Конечно укладывается. Но зачем так писать??