Почему свойство закрытия не работает в nodejs?

#javascript #node.js #closures

#javascript #node.js #замыкания

Вопрос:

Я новичок в node js и прохожу курс по его изучению. Однако я не могу заставить простое свойство закрытия javascript работать в нем. У меня есть 2 файла index.js и rectangle.js где я использую обратный вызов для возврата площади и периметра прямоугольника.

index.js

 var rect = require('./rectangle');

function solveRect(l,b) {
    console.log("Solving for rectangle with l = "   l   "and b = "   b);

    rect(l,b, (err,rectangle) => {
        if(err) {
            console.log("ERROR: "   err.message);
        }
        else {
            console.log("The area of rectangle of dimensions l = " 
                  l   "and b = "   b   " is "    rectangle.area());

            console.log("The perimeter of rectangle of dimensions l = " 
                  l   "and b = "   b   " is "    rectangle.perimeter());
        }
    });
    console.log("This statement is after the call to rect()");
}

solveRect(2,4);
solveRect(3,5);
solveRect(0,4);
solveRect(-3,-5);
  

rectangle.js

 module.exports = (x,y,callback) => {
    if( x <= 0 || y <= 0) {
        setTimeout(() =>
            callback(new Error("rectangle dimensions should be greater than zero"),
                null),
            2000
        );
    }
    else {
        setTimeout(() =>
            callback(null,
                {
                    perimeter: (x,y) => (2*(x y)),
                    area: (x,y) => (x*y)
                }),
            2000
        );
    }
}
  

Я вижу, что, поскольку длина и ширина уже доступны для обратного вызова из внешней области, нет необходимости передавать их при вызове функции rectangle.area().

Вывод: я получаю NaN, возвращаемый как площадь и периметр, а не как фактическая вычисленная площадь.

Ответ №1:

Функции perimiter и area принимают аргументы x и y , поэтому они используют эти аргументы для вычисления результатов, а не переменные, унаследованные от закрытия. Поскольку вы не предоставляете никаких аргументов при их вызове solveRect() , вы выполняете арифметику undefined , что приводит к NaN .

Избавьтесь от аргументов, чтобы они использовали переменные закрытия.

         setTimeout(() =>
            callback(null,
                {
                    perimeter: () => (2*(x y)),
                    area: () => (x*y)
                }),
            2000
        );