#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
);