JavaScript, MooTools - Область видимости переменной в глобальной переменной Class / overwrite - PullRequest
0 голосов
/ 19 сентября 2011

Может кто-нибудь объяснить мне, почему я могу перезаписать значение метода глобального экземпляра, просто установив его значение локально, и почему я не могу сделать что-то подобное с переменными?

Является ли единственным способом доступа к переменной использование иерархии объектов 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()
    })
})()

Ответы [ 2 ]

1 голос
/ 19 сентября 2011

Это связано с переменной областью действия.Javascript имеет функциональную область.

Таким образом, выполнив:

var someVar = this.someVar = false;

Вы объявляете локальную переменную someVar и глобальную переменную (которая поднимается к объекту окна, т.е. window.someVar), как это указано в вашем замыканиик глобальной области видимости, т.е. к окну.

Поэтому, когда вы пишете:

someVar = true;

Вы перезаписываете локальную переменную этим новым значением.

Переменные, объявленные в определении функцииявляются локальными для этой функции, если вы используете ключевое слово var:

(function () {
   var name = 'Mark';
})();
// Out here you cannot access name
console.log(name);
0 голосов
/ 19 сентября 2011

(если я правильно понял проблему)

Это не имеет ничего общего с Mootools или предложениями, @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

Я не совсем уверен, если это то, что вы спрашивали =) Надеюсь, это поможет

...