Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ReferenceError:未定义对象属性_Javascript - Fatal编程技术网

Javascript ReferenceError:未定义对象属性

Javascript ReferenceError:未定义对象属性,javascript,Javascript,我有以下JavaScript: var calc = { getMem: function(){ return mem; }, mem:0, add: function (a,b){ mem = a*b; return a*b; }, } 当我打电话时 calc.getMem(); calc.add(3,2); calc.getMem(); 我马上得到一个参考错误 然而,当我打电话时 calc.g

我有以下JavaScript:

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

    mem:0,

    add: function (a,b){
        mem =  a*b;
        return a*b;
    },
}
当我打电话时

calc.getMem();
calc.add(3,2);
calc.getMem();
我马上得到一个参考错误

然而,当我打电话时

calc.getMem();
calc.add(3,2);
calc.getMem();
我收到了期望的结果

显然我错过了这个,所以我把我的getMem改为

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

我的问题是:当我第一次调用add时,为什么它在初始状态(没有这个)下工作?

当您调用
cal.add
时,您正在创建一个全局变量
mem
。所以它看起来是有效的,因为
getMem
正在尝试访问该全局文件。但这可能不是你想要的。如果在
add()
之前调用
getMem()
,它仍在尝试访问全局
mem
,但它尚未定义,因此出现错误

var计算={
getMem:function(){
返回mem;
},
成员:0,
加:功能(a、b){
mem=a*b;
返回a*b;
},
}
计算添加(2,4)

console.log(mem)//全局可用
calc
不是一个类,这不是设置对象值的方式,如果您添加console.log()inside off
add
,您可以看到,
mem
在那里未定义,因此

mem =  a*b;
将名为
mem
的全局变量设置为
a*b
,而不是本地值

calc={
getMem:function(){
返回mem;
},
成员:0,
加:功能(a、b){
console.log(mem)
mem=a*b;
返回a*b;
},
}

calc.add(0,0)
当调用函数
getMem()
时,它无法找到任何名为
mem
的局部或全局变量,这就是为什么会出现引用错误。当您执行
add()
函数时,它会在全局范围内创建一个变量
mem
,因此现在当您调用
getMem()
global variable
mem
时,将返回该变量

strict
模式下执行程序,您将得到参考错误。
“使用严格的”
变量计算={
getMem:function(){
返回mem;
},
成员:0,
加:功能(a、b){
mem=a*b;
返回a*b;
},
}
计算添加(2,4)

console.log(mem)
该死,我想这就是为什么应该使用严格模式。Ha@Vanice——是的,我想每个人都会因为这样的事情而相信严格模式。当你有了JS的C#背景时,你会期待“对象”的这种成员行为:)谢谢你的所有答案,我从现在开始会使用严格模式来防止这样的问题