Две функции сравнивались со скобкой. Исполнение ИИФЭ. Результаты NaN

Функция числового возврата и функция неопределенного возврата в скобках сравнивались и затем выполнялись с помощью IIFE. Результат NaN. Что случилось?

function Point(x, y) {
    this.x = x;
    this.y = y;
}
console.log(
    (
        new Point(5, 8).sum || (() => undefined)
    )() // IIFE : undefined
);

// sum() added
Point.prototype.sum = function () {
    return this.x + this.y;
}

console.log(
    (new Point(5, 8).sum)() 
    // 13
);

console.log(
    // typeof : number
    (
        new Point(5, 8).sum || (() => undefined)

    )()//! IIFE : NaN. ???? WH~~~Y????
);

На последнем console.log голый ментал рухнул. Подскажите почему.... :(


person Truestar    schedule 06.03.2020    source источник


Ответы (1)


При вызове в этом контексте this оказывается не тем, что вы ожидаете; это исходит из окружающего контекста, потому что функция sum не привязана.

Это означает, что ваше тело функции в конечном итоге оценивает undefined + undefined, что равно NaN.

Упрощенный пример этой проблемы можно увидеть с помощью:

let p = new Point(5, 8)
let f1 = p.sum
f1() //-> NaN

Вместо этого вы можете вручную передать параметр this:

f1.call(p) //-> 13

Или вы можете явно привязать эту функцию к определенному this:

let f2 = Point.prototype.sum.bind(new Point(5, 8))
f2() //-> 13
person Community    schedule 06.03.2020
comment
Потрясающие! Ловушка, которую я сделал, я попался на нее. Вы дали мне мудрый ответ на мою ошибку. Спасибо за ваш добрый ответ. - person Truestar; 07.03.2020