JS中变量的作用域

Scope of variables in JS

请查看以下 JS 代码段:

var MyClass = function() {
    var logging = true;

    this.myFunction = function(logging) {

    }
}

myObj = new MyClass();
myObj.myFunction(false);

有没有办法访问 myFunction 中的两个 logging 变量?

我想出的唯一解决方案 (this.logging) 似乎不起作用: https://jsfiddle.net/x7m3w3gp/

在您的代码中,您创建的匿名函数的形式参数与局部变量同名(在这两种情况下都是 "logging")。在该匿名函数(以​​ "myFunction" 属性 结尾的函数)中,符号 "logging" 将引用参数。无法访问也称为 "logging".

的局部变量

解决这个问题的方法是给参数一个不同的名称。

请注意,this.logging 指的是名为 "logging" 的 属性,如果有的话。在您发布的代码中,没有这样的 属性.

尝试将日志记录定义为 MyClass 的 属性。这应该有效:

var MyClass = function() {
    this.logging = true;
}


MyClass.prototype.myFunction = function(logging) {
    /*References the logging-Property of the MyClass-Object:*/
    var log1 = this.logging;

     /*References the parameter:*/
    var log2 = logging;
}

myObj = new MyClass();
myObj.myFunction(false);

myFunction 方法的代码中,无法从其外部范围访问局部变量,因为参数正在隐藏变量。

使用 this.logging 不会访问变量,它会访问同名对象的 属性。

您可以在该范围内放置一个可以访问该变量的函数,以用作 myFunction 方法的桥梁。

变量示例,属性 和网桥用法:

var MyClass = function() {
    // local variable
    var logging = true;
    // property
    this.logging = 1;

    // bridge local variable
    function getLogging() { return logging; }

    this.myFunction = function(logging) {
      console.log(logging); // parameter
      console.log(this.logging); // property
      console.log(getLogging()); // local variable
    }
}

myObj = new MyClass();
myObj.myFunction(false);

这应该有效;

var MyClass = function() {
    this.logging = true;
    var logging = 0;

    this.myFunction = function(logging) {
        var console = document.getElementById('console');
        console.innerHTML = 'logging: ' + logging + '<br />';
        console.innerHTML += 'this.logging: ' + this.logging + '<br/>';
        console.innerHTML += 'var loggin:' + logging + ' !!! <br/>--> var logging scope never access';
    }
}

myObj = new MyClass();
myObj.myFunction(false);

https://jsfiddle.net/x7m3w3gp/2/