JavaScript var видимость - PullRequest
       20

JavaScript var видимость

2 голосов
/ 05 апреля 2011

Учитывая этот код:

function MyClass() {
    var v = '1';
    this.hi = function() {
        console.log('Value of V is ' + v);
        var v = '2';
        console.log('Value of V is ' + v);
        delete(v);
        console.log('Value of V is ' + v);
    }
}

Когда я делаю что-то вроде:

z = new MyClass();
z.hi();

В результате я получаю:

Value of V is undefined 
Value of V is 2
Value of V is 2

Что я хочуОбъясните, почему результат таков.

  • Почему V не определено (как я понимаю - и это может быть неверно - в JS все время определения, а нево время выполнения, так что по определению у функции была своя собственная переменная "v", но она еще не определена в первой строке).

  • Почему V не удаляется?Держал такое же значение?

  • Как получить доступ к "v" со значением "1" из "на один уровень вверх"?

  • Я знаю, еслиЯ использую другое имя переменной в функции «hi», я смогу «увидеть» переменную «v» со значением «1» в функции.Так что я вроде как прячу оригинал, но это все еще оставляет вопрос № 3 - как мне получить доступ к «первому уровню»?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 05 апреля 2011

Вы не можете delete такую ​​переменную .

Вы не можете получить доступ к v из окружающей области, потому что v во внутренней области скрывает его. Переименуйте его.

1 голос
/ 05 апреля 2011

Что касается почему неопределенная часть, то, к чему ваш код компилируется:

function MyClass() {
    var v = '1';
    this.hi = function() {
        var v;
        console.log('Value of V is ' + v); // undefined!
        v = '2';
        console.log('Value of V is ' + v);
        delete(v);
        console.log('Value of V is ' + v);
    }
}

Как видите, переменная объявлена ​​в начале области видимости. Вот как работает JS. Запустите его через JSLint и убедитесь сами.

0 голосов
/ 05 апреля 2011

Измените это на:

function MyClass() {
    this.v = '1';
...

И убедитесь, что вы всегда используете эту функцию с New.

this относится к объекту, членом которого является вещь. Таким образом, создание this.hi делает что-то в области видимости совершенно не связанным с самой функцией, но использование this для всех членов делает их частью одного и того же объекта (которому назначена функция).

http://jsfiddle.net/hHvUq/

...