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

Javascript changes variable between caller "methods"

本文关键字:之间 改变 变量 方法 调用者 Javascript      更新时间:2023-09-26

给定:

    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 在柱线之前: 2" 范围.html:37

"testfunc.bar:3"范围.html:44

"testfunc.foo after bar: 3" scope.html:39

"主:1"范围.html:66

"testvar.foo 在柱线之前: 4" 范围.html:51

"测试变量:5"范围.html:58

"testvar.foo 后柱线:5" 范围.html:53

"主:5"范围.html:68

是否应该是这样的,i 变量在 javascript 对象中从一个方法/函数继承到另一个方法/函数?这是否意味着在javascript中实例化对象的唯一安全方法是在函数上使用"new",还是我完全错过了重点?

你的变量i是一个全局变量(它不是在本地声明的,所以Javascript只是让它全局的),所以无论你在哪里改变它,它都是你正在使用和修改的变量。

如果您希望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会让它成为一个隐式的全局变量,然后作为单个全局变量提供给所有代码。