功能相互覆盖

时间:2015-12-04 22:12:44

标签: javascript

我有两个函数,每个函数都有一个名为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

为什么会这样,我该如何解决?

3 个答案:

答案 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
    });
}