2015-07-08 3 views
0

Если я вызываю функцию find APP.count(), все в порядке. Я получаю правильный результат, но когда я вызываю APP.add(), я получаю this.basket не определено. Я не понимаю, почему это происходит?Объект, возвращающийся как undefined

var APP = (function() { 

    var 
    basket = [ 
     { id: 100, price: 10, description: '', name: 'item one', quantity: 10, url: '' }, 
     { id: 200, price: 20, description: '', name: 'item two', quantity: 15, url: '' } 
    ], 

    find = function(item) { 
     for(var i = 0; i < this.basket.length; i++) { 
     if(this.basket[i].id === item) { 
      return i 
     } 
     } 
     return null 
    }, 

    add = function(item) { 
     var itemFound = find(item) 
    }, 

    count = function() { 
     var total = 0; 
     for(var i = 0; i < this.basket.length; i++) { 
     total = total + this.basket[i].quantity 
     } 
     return total 
    }; 

    return { 
    basket: basket, 
    find: find, 
    add: add, 
    count: count 
    }; 

})(); 

APP.count()  /* works */ 
APP.add()  /* returns this.basket as undefined */ 
+4

Edited. вам нужно вызвать 'this.find (item)' вместо 'find (item)' Я думаю – Hacketo

+0

Спасибо, что это работало, но я не понимаю, как корзина не является свойством APP? – UsmanA

+0

Я отредактировал свой комментарий, потому что я не видел, что функция возвращает объект с одинаковыми свойствами, оба будут работать. – Hacketo

ответ

1

Проблема заключается в вызове find(item) в функции add.

Вызов find функции, как это не будет использовать контекст APP объекта, как this, так this.basket будет неопределенным.

Вы можете проверить, что текущий контекст this с простой console.log(this)

Итак, если вы хотите, чтобы вызвать find функцию с контекстом АРР, в функции add вам нужно вызвать this.find(item)

+0

Отмечено как принятый ответ, так как это был вы первый – UsmanA

0

Hi вопрос с ссылкой это при вызове метода поиска с помощью оных()

add = function(item) { 
 
     var itemFound = find(item) 
 
    },

это ключевое слово имеет в виду объект окна

попробовать с этим ниже исполняемый код

var APP = (function() { 
 

 
    var 
 
    basket = [ 
 
     { id: 100, price: 10, description: '', name: 'item one', quantity: 10, url: '' }, 
 
     { id: 200, price: 20, description: '', name: 'item two', quantity: 15, url: '' } 
 
    ], 
 

 
    find = function(item) { 
 
     for(var i = 0; i < this.basket.length; i++) { 
 
     if(this.basket[i].id === item) { 
 
      return i 
 
     } 
 
     } 
 
     return null 
 
    }, 
 

 
    add = function(item) { 
 
     var itemFound = this.find(item) //changed 
 
     return itemFound;    //changed 
 
    }, 
 

 
    count = function() { 
 
     var total = 0; 
 
     for(var i = 0; i < this.basket.length; i++) { 
 
     total = total + this.basket[i].quantity 
 
     } 
 
     return total 
 
    }; 
 

 
    return { 
 
    basket: basket, 
 
    find: find, 
 
    add: add, 
 
    count: count 
 
    }; 
 

 
})();

Смежные вопросы