我有两个函数,每个函数都有一个名为s
的变量(在本例中)。当我实例化一个函数时,它很好,但是当我实例化另一个函数后,第二个函数会覆盖第一个函数s
。
代码:
t1 = function(){
s = 2;
Object.defineProperty(this, "test", {
value: function(){
console.log(s);
},
configurable: false
});
}
t2 = function(){
s = 42;
Object.defineProperty(this, "test", {
value: function(){
console.log(s);
},
configurable: false
});
}
var t = new t1()
t.test(); // 2
var y = new t2();
y.test(); // 42
t.test(); // 42
为什么会这样,我该如何解决?
答案 0 :(得分:4)
问题是s
来自全球范围。要在函数内定义变量s
,请使用
var s = 2;
为避免此类错误,您可以添加
行"use strict";
到文件的开头。这样就可以禁止访问全局范围内未声明的变量。
答案 1 :(得分:2)
因为s成为全局变量,所以在每个s之前设置var。
答案 2 :(得分:1)
您从函数范围之外的某处引用s
这意味着,它们将共享该变量,因为它不会在自己的范围内重新声明。
试试这个:
t1 = function(){
var s = 2;
Object.defineProperty(this, "test", {
value: function(){
console.log(s);
},
configurable: false
});
}
t2 = function(){
var s = 42;
Object.defineProperty(this, "test", {
value: function(){
console.log(s);
},
configurable: false
});
}