Tengo el siguiente JavaScript:

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

    mem:0,

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

Cuando llamo

calc.getMem();

Justo después recibo un ReferenceError

Sin embargo, cuando llamo

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

Recibo el resultado deseado.

Obviamente me faltaba esto, así que cambié mi getMem a

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

Mi pregunta es: ¿Por qué funciona en el estado inicial (sin esto) cuando llamo a add por primera vez?

2
Vanice 13 sep. 2018 a las 19:53

3 respuestas

La mejor respuesta

Cuando llamas a cal.add estás creando una variable global mem. Así que parece que funciona porque getMem está intentando acceder a ese global. Pero probablemente no sea lo que quieres. Si llama a getMem() antes de add(), todavía está intentando acceder al mem global, pero aún no se ha definido, de ahí el error.

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
2
Mark Meyer 13 sep. 2018 a las 17:02

Cuando llama a su función getMem(), no puede encontrar ninguna variable local o global con el nombre mem por eso obtiene un error de referencia. Cuando ejecuta su función add(), crea una variable mem en el ámbito global, por lo que ahora cuando llama a getMem() se devuelve la variable global mem.

Ejecute el programa en modo strict y obtendrá un error de referencia.

"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) 
1
amrender singh 13 sep. 2018 a las 17:00

calc no es una clase, no es así como establece los valores de un objeto, si agrega un console.log () dentro de add puede ver que mem no está definido allí , entonces la línea

mem =  a*b;

Establece una variable global llamada mem en a*b, en lugar de un valor local,

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

    mem:0,

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

calc.add(0,0)

Tienes que configurarlo con 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())

Y también devuelve this.mem en la función getMem

2
Luca Kiebel 13 sep. 2018 a las 17:06