Данный вопрос является точным дубликатом:
Есть такой код, нашел в книге по js. В этом примере нет ошибок. все выводится как надо и выводится 450
'use strict';
function CoffeeMachine(power, capacity) {
var waterAmount = 0;
this.waterAmount = function(amount) {
if(!arguments.length)
return waterAmount;
if(amount < 0) {
throw new Error('Значение должно быть положительным!');
}
if(amount > capacity) {
throw new Error('Значение не должно быть больше ' + capacity);
}
waterAmount = amount;
};
}
var coffeeMachine = new CoffeeMachine(1000, 500);
coffeeMachine.waterAmount(450);
alert(coffeeMachine.waterAmount());
Но в этом примере выводится undefined
'use strict';
function CoffeeMachine(power, capacity) {
var waterAmount = 0;
this.waterAmount = function(amount) {
if(!arguments.length)
return waterAmount;
if(amount < 0) {
throw new Error('Значение должно быть положительным!');
}
if(amount > capacity) {
throw new Error('Значение не дожно быть больше ' + capacity);
}
waterAmount = amount;
};
}
var coffeeMachine = new CoffeeMachine(1000, 500);
alert(coffeeMachine.waterAmount(450));
Тут я просто в alert записал сразу и все. объясните в чем разница, почему когда не в alert записано то все работает, а наоборот нет.
// вызов без параметров - getter - возвращает текущее значение
var a1 = coffeeMachine.waterAmount();
// вызов с параметром - setter - ничего не возвращает
var a2 = coffeeMachine.waterAmount(123);
console.log(a1, a2);
Можете написать
this.waterAmount = function(amount) {
if(!arguments.length)
return waterAmount;
...
return waterAmount = amount;
};
Тогда setter будет возвращать новое значение.
смотри ..у тебя происходит следующее- при первом вызове
coffeeMachine.waterAmount(450);
у тебя функция ничего не отдает так как не выполняются условия в if :
первый if
!arguments.length
- будет true если не будет у метода waterAmount аргументов.. а больше ретурнов и нет. поэтому метод ничего не возвращает. но метод записывает значение
waterAmount = amount
и при следующем вызове его без параметров выполнится первый if и будет возвращено значение 450. отсюда и такое поведение. что бы он сработал в alert - вызови метод с аргументом, а в алерте уже без.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Моя задача сделать анимацию из спрайтов, они разбиты по на разные png, и я сделал чтобы спрайты менялись, но скорость смены этих спрайтов бешенаяПодскажите...
При клике на кнопку, в блок (с атрибутом contenteditable) помещается имя и оборачивается в элемент b и надо потом печатать после имени, если кликнуть...