JS中的变量范围

时间:2015-03-17 14:17:01

标签: javascript scope closures

请查看以下JS代码段:

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

    this.myFunction = function(logging) {

    }
}

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

有没有办法在 myFunction 中访问记录变量?

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

4 个答案:

答案 0 :(得分:1)

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);

答案 1 :(得分:0)

在您的代码中,您创建的匿名函数的形式参数与本地变量具有相同的名称(在两种情况下都是“logging”)。在该匿名函数(最终作为“myFunction”属性的函数)中,符号“logging”将引用该参数。无法访问也称为“日志记录”的本地变量。

解决方案是为参数指定一个不同的名称。

请注意,this.logging将引用名为“logging”的属性(如果有)。在您发布的代码中,没有任何此类属性。

答案 2 :(得分:0)

尝试将日志记录定义为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);

答案 3 :(得分:0)

这应该有用;

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/