【问题标题】:JavaScript, MooTools - Variable scope in Class/overwrite global variableJavaScript,MooTools - 类中的变量范围/覆盖全局变量
【发布时间】:2011-11-20 04:57:04
【问题描述】:

谁能解释一下,为什么我可以通过在本地设置它的值来覆盖全局实例的方法值,以及为什么我不能对变量做类似的事情?

访问变量的唯一方法是使用window 对象层次结构吗?或者有没有更短的方法?

(function() {
    console.log(this);

    var someVar = this.someVar = false;

    var subClass = new Class({
        test: false,

        setValue: function(value) {
            this.test = value
        }
    });

    var subPub = this.subPub = new subClass();

    var MainClass = new Class({
        rewriteVar: function() {
            console.log("someVar = " + someVar); // returns global value
            console.log("subPub.test = " + subPub.test); // returns global value

            someVar = true;

            console.log("someVar local: " + someVar); // returns new local value
            console.log("someVar global: " + window.someVar); // returns old global value

            subPub.setValue(true);

            console.log("subPub.test local: " + subPub.test); // returns new local value
            console.log("subPub.test global: " + window.subPub.test) // returns new global value
        }
    });

    /* var someObj = this.someObj = {};

    var someVar = someObj.someMeth = false;

    // And why is this possible?
        var MainClass = new Class({
            rewriteVar: function() {
            someObj.someMeth = true;
            console.log(window.someObj.someMeth); // returns new global value
        }
    }); */

    window.addEvent("load", function() {
        var test = new MainClass();
        test.rewriteVar()
    })
})()

【问题讨论】:

  • 在一种情况下,您正在更改保存原始值的变量,在另一种情况下更改对象的属性。原始值都是不可变的。

标签: javascript class object mootools scope


【解决方案1】:

这与变量范围有关。 Javascript具有功能范围。

所以这样做:

var someVar = this.someVar = false;

您正在声明一个局部变量 someVar 和一个全局变量(它被提升到窗口对象,即 window.someVar),因为您的闭包中的 this 指的是全局范围,即窗口。

所以当你写的时候:

someVar = true;

您正在用这个新值覆盖局部变量。

如果您使用 var 关键字,则在函数定义中声明的变量是该函数的本地变量:

(function () {
   var name = 'Mark';
})();
// Out here you cannot access name
console.log(name);

【讨论】:

    【解决方案2】:

    (如果我理解正确的话)

    这与 Mootools 或 clases 无关,@Felix_Kling 已经给了你答案,但我会用一个简单的例子来说明:

    var aObj = bObj = {}; //since bObj is an 'object', aObj will store the objects reference 
    aObj.foo = "bar";
    console.log(aObj.foo);
    console.log(bObj.foo);
    // output:
    //     "bar"
    //     "bar"
    
    
    var a = b = 1; //since 'b' is primitive, 'a' will not store a reference of 'b', it will only copy it's value
    a = 0;
    console.log(a);
    console.log(b);
    // output:
    //     0
    //     1
    

    我不确定这是否是您所要求的 =) 希望这会有所帮助

    【讨论】:

    • 谢谢,这对我很有帮助。 =)
    猜你喜欢
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2013-01-24
    • 2015-03-13
    • 2012-05-10
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    相关资源
    最近更新 更多