假设:
function testfunc(i) {
this.foo = function() {
i = 2;
console.log("testfunc.foo before bar: " + i);
this.bar();
console.log("testfunc.foo after bar: " + i);
};
this.bar = function() {
i = 3;
console.log("testfunc.bar: " + i);
};
}
var testvar = {
foo: function() {
i = 4;
console.log("testvar.foo before bar: " + i);
this.bar();
console.log("testvar.foo after bar: " + i);
},
bar: function() {
i = 5;
console.log("testvarbar: " + i);
}
};
var a = new testfunc();
var b = Object.create(testvar);
i = 1;
a.foo();
console.log("main: " + i);
b.foo();
console.log("main: " + i);
结果是:
" testfunc.foo在bar之前:2" scope.html:37
" testfunc.bar:3" scope.html:44
条形码后的" testfunc.foo:3" scope.html:39
"主要:1" scope.html:66
" testvar.foo在bar之前:4" scope.html:51
" testvarbar:5" scope.html:58
条形码后的" testvar.foo:5" scope.html:53
"主要:5" scope.html:68
它应该是这样的,i变量是从javascript对象中的一个方法/函数继承到另一个吗?这是否意味着在javascript中实例化对象的唯一安全方法是使用" new"在一个函数上,还是我完全忽略了这一点?
答案 0 :(得分:0)
您的变量i
是一个全局变量(它不是在本地声明的,因此Javascript只会使其成为全局变量)因此,无论您在哪里更改它,它都是您的同一个变量&&。 #39;重新使用和修改。
如果您希望i
是一个方法的本地方法,请将var
放在每个地方的前面,并按照以下方式声明:
this.foo = function() {
var i = 2;
console.log("testfunc.foo before bar: " + i);
this.bar();
console.log("testfunc.foo after bar: " + i);
};
如果您希望i
成为对象的属性,请使用this.i
引用它。
this.foo = function() {
this.i = 2;
console.log("testfunc.foo before bar: " + this.i);
this.bar();
console.log("testfunc.foo after bar: " + this.i);
};
如果你只是引用一个未定义的变量,那么Javascript使它成为一个隐式的全局变量,然后可以将所有代码作为单个全局变量使用。