Referenceerror: свойство объекта не определено

У меня есть следующий код JavaScript:

var calc = {
    getMem: function(){
        return mem;
    },

    mem:0,

    add: function (a,b){
        mem =  a*b;
        return a*b;
    },
}

Когда я звоню

calc.getMem();

сразу после этого я получаю ReferenceError

Однако когда я звоню

calc.add(3,2);
calc.getMem();

Получаю желаемый результат.

Очевидно, мне не хватало этого, поэтому я изменил свой getMem на

getMem: function(){
    return this.mem;
}

Мой вопрос: почему он работает в исходном состоянии (без этого), когда я впервые вызываю add?

Спасибо за все ответы, с этого момента я буду использовать строгий режим, чтобы предотвратить такие проблемы.

Vanice 13.09.2018 19:03
2
1
76
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Когда вы вызываете cal.add, вы создаете глобальную переменную mem. Кажется, что это работает, потому что getMem затем пытается получить доступ к этому глобальному. Но, вероятно, это не то, что вам нужно. Если вы вызываете getMem() перед add(), он все еще пытается получить доступ к глобальному mem, но он еще не определен, отсюда и ошибка.

var calc = {
  getMem: function(){
      return mem;
  },

  mem:0,

  add: function (a,b){
      mem =  a*b;
      return a*b;
  },
}
calc.add(2, 4)
console.log(mem) // available globally

Черт возьми, я думаю, поэтому следует использовать строгий режим.

Vanice 13.09.2018 19:03

Ха @Vanice - да, я думаю, что все убеждают в строгом режиме примерно так.

Mark 13.09.2018 19:03

Когда вы приходите к JS с фоном C#, вы ожидаете, что это поведение членов "объектов" :)

Vanice 13.09.2018 19:04

calc не является классом, это не то, как вы устанавливаете значения объекта, если вы добавите console.log () внутри add, вы увидите, что mem там не определен, поэтому строка

mem =  a*b;

устанавливает глобальную переменную с именем mem в a*b вместо локального значения,

calc = {
    getMem: function(){
        return mem;
    },

    mem:0,

    add: function (a,b){
	console.log(mem)
        mem =  a*b;
        return a*b;
    },
}

calc.add(0,0)

Вы должны установить его с помощью this.mem:

"use strict";    

const calc = {
    getMem: function(){
        return this.mem;
    },

    mem:0,

    add: function (a,b){
        this.mem =  a*b;
        return a*b;
    },
}

calc.add(2,3)
console.log(calc.getMem())

А также вернуть this.mem в функции getMem

Когда вы вызываете свою функцию getMem(), она не может найти ни одну локальную или глобальную переменную с именем mem, поэтому вы получаете справочную ошибку. Когда вы выполняете свою функцию add(), она создает переменную mem в глобальной области видимости, поэтому теперь, когда вы вызываете getMem(), возвращается глобальная переменная mem.

Запустите программу в режиме strict, и вы получите справочную ошибку.

"use strict"
var calc = {
  getMem: function(){
      return mem;
  },

  mem:0,

  add: function (a,b){
      mem =  a*b;
      return a*b;
  },
}
calc.add(2, 4)
console.log(mem) 

Другие вопросы по теме