javascript私有函数访问公共变量

Mir*_*ror 13 javascript private class public

我有这堂课:

function ctest() {
    this.var1 = "haha";
    this.func1 = function() {
        alert(this.var1);
        func2();
        alert(this.var1);
    }
    var func2 = function() {
        this.var1 = "huhu";
    }
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

    var myobj = new ctest();
    myobj.func1();
Run Code Online (Sandbox Code Playgroud)

是不是第二个警报会弹出"huhu"?func2是私有的,是否可以访问var1公共变量?

如果私有函数无法访问公共变量,我该怎么办?

提前致谢!

Aln*_*tak 17

您需要为以下呼叫提供上下文func2:

this.func1 = function() {
    alert(this.var1);
    func2.call(this);
    alert(this.var1);
}
Run Code Online (Sandbox Code Playgroud)

如果没有上下文,调用将使用全局对象(即window) - 您应该看到何时运行window.var1在两个警报之间创建的当前代码.

  • @MIrrorMirror no,`.call`的第一个参数在函数中设置隐含的`this`值. (2认同)

Luc*_*ero 12

函数不依赖于实例,因此您的调用func2最终会作为调用而不this指向预期的实例.

您可以修复调用以包含上下文:

function ctest() {
    this.var1 = "haha";
    this.func1 = function() {
        alert(this.var1);
        func2.call(this);
        alert(this.var1);
    }
    var func2 = function() {
        this.var1 = "huhu";
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用所需对象引用保留变量:

function ctest() {
    var that = this;
    this.var1 = "haha";
    this.func1 = function() {
        alert(this.var1);
        func2();
        alert(this.var1);
    }
    var func2 = function() {
        that.var1 = "huhu";
    }
}
Run Code Online (Sandbox Code Playgroud)