Подтвердить что ты не робот

Можно ли явно ссылаться на глобальную переменную JavaScript, которая была затенена локальным с тем же именем?

Я видел множество сообщений о различии между глобальной и функциональной областью в JavaScript, слишком много для ссылки здесь. Я также заметил, что мой точный вопрос спросил о Python. Так что я хочу знать, как я могу получить доступ к глобальной переменной, когда "более близкая" область также имеет переменную с тем же именем?

var a = "global";
function b(){
  var a = "local";
  var magic = ...; // somehow put "global" in magic
  console.log(magic); // should print "global"
}

Только в браузере я понял, что вы можете использовать window.a для указания глобального. Есть ли что-то, что работает на стороне сервера?

4b9b3361

Ответ 1

Если он действительно глобальный (т.е. не только во внешней области), вы можете сделать это:

var magic = (function(name){return this[name]}).call(null, "a");

Из документации ECMAScript (10.4.3):

Ввод кода функции

Следующие шаги выполняются, когда управление вводит выполнение контекст для кода функции, содержащегося в функциональном объекте F, вызывающего при условии, что этотArg, и вызывающий объект предоставил аргументыList:

Если код функции является строгим кодом, установите значение ThisBinding для этогоArg. Иначе, если thisArg имеет значение null или undefined, установите значение ThisBinding для глобальный объект.

Обратите внимание, что вы не можете проверить это в jsFiddle, поскольку глобальная область не там, где вы определяете свой.

Демонстрация

var a = "global";

function b(){
  var a = "local";
  var magic = (function(name){return this[name]}).call(null, "a");
  document.body.textContent = 'a: '+JSON.stringify(magic); // print "global"
}

b();

Ответ 2

Нет такого стандарта. В моих собственных целях я всегда ставил свои переменные в контейнер, где имя напоминает имя проекта:

var PROJECT = {};//Поместите все "глобалы" для "проекта" в этот контейнер

Таким образом, я могу собрать все переменные в одном месте, и если мне нужно передать "глобальные" круги, я должен передать не более одной ссылки.

Ответ 3

Используя ваш код в качестве основы для ответа, вы можете использовать следующее, чтобы фактически вывести глобальную версию "a" в отличие от локальной версии:

var a = "global";
function b(){
  var a = "local";
  var magic = this.a; // somehow put "global" in magic
  console.log(magic); // should print "global"
}
b();

Это будет работать, только если вы вызываете функцию b() в форме выше. Пример, в котором это не будет работать, выглядит следующим образом:

var a = "global";
function b(){
  var a = "local";
  var magic = this.a; // somehow put "global" in magic
  console.log(magic); // should print "global"
}
b.call({a : "other context"});

В приведенном выше случае "other context" будет напечатано на консоли.

Ответ 4

Ну, у меня нет прямого ответа, но обходным путем является использование хорошо установленного контейнера, например окна

window['a'] = "global";

Это не очень чистое решение, но оно выполняет работу

Ответ 5

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

Вот пример скрипта.