Присвоение закрытой переменной значению переменной с тем же именем из ее родительской области - PullRequest
0 голосов
/ 17 сентября 2011

Может ли частная переменная в дочерней области быть установлена ​​равной значению частной переменной с таким же именем из ее родительской области?

Рассмотрим следующее:

var foo = 10;

function bar () {
  var f = foo, foo = f;
  return foo;
}

bar() // Returns 10

Может ли это бытьсделано без использования переменной-заполнителя f?

var foo = 10;

function bar () {
  var foo = foo;
  return foo;
}

bar() // Want 10 but returns undefined.

Я бы хотел решение, которое не передает аргументы bar.Я понимаю, что это не важно по любой причине, кроме эстетики.

Ответы [ 2 ]

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

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

var foo = foo;

Объявление foo заканчивается только после достижения ;.Но попытка инициализации foo для foo сама по себе не определена, поскольку она не достигла своей конечной точки объявления.

0 голосов
/ 17 сентября 2011

Да, но вам придется явно ссылаться на foo вне родительской области.Обычно это просто this, но вам нужно быть осторожным в ситуациях, когда ваша функция может быть вызвана через apply или call.Это, например, должно работать:

var foo = 10;

function bar () {
  var foo = this.foo;
  return foo;
}

bar(); // 10

Редактировать: мне нужно внести поправку, согласно комментарию @Felix.this действительно обычно ссылается на глобальную область, а не на родительскую область.Рассмотрим это, например:

var x = 'global';
(function () {
    var x = 'inner';
    (function() {
        var x = this.x;
        console.log(x); // 'global'
    })();
})();
...