Консольное ведение журнала возвращает значение null

Я пытаюсь создать хранилище потоков для приложения React, которое я создаю. Я использую пакет npm polyfill с назначением объекта и библиотеку Flux от Facebook.

Первоначально я получал сообщение об ошибке «Невозможно прочитать свойство '_data' of null» в консоли, которая ссылалась на var currIds = this._data.map(function(m){return m.id;});. В настоящее время этот метод является единственным, который вызывается напрямую. Затем я сделал console.log(this), который вернул «null».

Я нахожу это странным. Что здесь происходит?

Мой код:

var Assign = require('object-assign');
var EventEmitterProto = require('events').EventEmitter.prototype;
var CHANGE_EVENT = 'CHANGE';

var StoreMethods = {

init: function() {},
set: function (arr) {
console.log(this);
    var currIds = this._data.map(function(m){return m.id;});

    arr.filter(function (item){
      return currIds.indexOf(item.id) === -1;
    }).forEach(this.add.bind(this));

},
add: function(item){
  console.log(this);
    this._data.push(item);
},
all: function() {
    return this._data;
},
get: function(id){
   return this._data.filter(function(item){
       return item.cid === id;
   })[0];
},
addChangeListener: function(fn) {
    this.on(CHANGE_EVENT, fn);
},
removeChangeListener: function(fn) {
    this.removeListener(CHANGE_EVENT, fn);
 },
 emitChange: function() {
    this.emit(CHANGE_EVENT);
 },
 bind: function(actionType, actionFn) {
    if(this.actions[actionType]){
        this.actions[actionType].push(actionFn);
    } else {
        this.actions[actionType] = [actionFn];
    }
}
};

exports.extend = function(methods) {
var store = {
_data: [],
actions: {}
};

Assign(store, EventEmitterProto, StoreMethods, methods);
store.init();

require('../dispatcher').register(function(action){
   if(store.actions[action.actionType]){
       store.actions[action.actionType].forEach(function(fn){
        fn.call(null, action.data);
       })   
   }
  });

  return store;
 };

person user2641611    schedule 12.01.2016    source источник
comment
Поскольку javascript реализует область действия функциональным способом, только функции создают новые области.   -  person Hitmands    schedule 12.01.2016
comment
Вероятный дубликат: stackoverflow.com/questions/7043509/this-inside-object   -  person mplungjan    schedule 12.01.2016


Ответы (1)


Я не могу see, где вызывается set, однако ваш this может быть null, если функция вызывается через call (см. здесь) или apply, а ваш первый аргумент — null. Это также происходит в обратном вызове require.register:

fn.call(null, action.data) //First parameter is your 'this'.
person mamoo    schedule 12.01.2016
comment
Изменение первого параметра (контекста) .call, похоже, сработало. Спасибо! :-) - person user2641611; 12.01.2016