Javascript在调用者“方法”之间更改变量

时间:2014-12-01 08:03:36

标签: javascript inheritance

假设:

    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"在一个函数上,还是我完全忽略了这一点?

1 个答案:

答案 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使它成为一个隐式的全局变量,然后可以将所有代码作为单个全局变量使用。