2016-11-19 5 views
0

Я пытаюсь тренировать себя, чтобы написать функцию сцепления, но получил ошибкуметод цепочки потерпел неудачу в JavaScript

Cannot read property 'minus' of undefined(…)

Что случилось с моим кодом?

var math = function(){ 
 
    var result = 0; 
 
    
 
    var add = function(param){ 
 
    result += param; 
 
    }; 
 
    
 
    var minus = function(param){ 
 
    result -= param; 
 
    }; 
 
    
 
    var print = function(){ 
 
     console.log(result) 
 
    }; 
 
    
 
    return {add:add, minus: minus, print:print}; 
 
} 
 

 
var calculator = math(); 
 
var result = calculator.add(5).minus(1).print(); 
 
console.log(result)

+2

Ваши функции ничего не возвращают в явном виде. Поэтому вызов 'calculator.add (5)' вернет вам 'undefined', который, конечно же, не имеет' .minus'. – vlaz

ответ

3

Вы должны вернуть объект (this) в этом случае, в «цепочку», как вы ожидаете

Вы print() также ничего не вернуть, так result всегда не определено.

var math = function(){ 
 
    var result = 0; 
 
    
 
    var add = function(param){ 
 
    result += param; 
 
    return this; 
 
    }; 
 
    
 
    var minus = function(param){ 
 
    result -= param; 
 
    return this; 
 
    }; 
 
    
 
    var print = function(){ 
 
     console.log('result: ' + result); 
 
     // print doesnt return anything, it needs to if you want to assign anything by calling it 
 
     return result; 
 
    }; 
 
    
 
    return {add:add, minus: minus, print:print}; 
 
} 
 

 
var calculator = math(); 
 
var result = calculator.add(5).minus(1).print(); 
 
console.log(result)

+0

aw, какая беспечная ошибка! Спасибо! –

+0

Если это решает, сделайте отметку как правильно :) – Stuart

0

Вы также можете сохранить ссылку на объект возвращается.

var math = function() { 
 
    var result = 0; 
 

 
    var add = function(param) { 
 
    result += param; 
 
    
 
    return math; 
 
    }; 
 

 
    var minus = function(param) { 
 
    result -= param; 
 
    
 
    return math; 
 
    }; 
 

 
    var print = function() { 
 
    console.log(result) 
 
    }; 
 
    
 
    var math = { 
 
    add: add, 
 
    minus: minus, 
 
    print: print 
 
    }; 
 
    
 
    return math; 
 
} 
 

 
var calculator = math(); 
 
calculator.add(5).minus(1).print();

+2

Почему бы просто не использовать 'this'? –

+0

* shrug * Я больше привык использовать «это», когда есть новый участник. Этот снайпер не использовал ничего нового. – Taplar