Временно замените глобальную переменную в локальной области - PullRequest
0 голосов
/ 31 октября 2011

Прежде чем что-то спросить, я пойду дальше и скажу, что это теоретический вопрос;однако, это может быть реализовано на веб-сайте позже.

В любом случае, у меня есть переменная, любая переменная.Допустим, это a и его область действия глобальна.Теперь для конкретной функции я хочу установить значение этой переменной, отличное от ее глобального значения, но основанное на ней, и без глобального изменения значения.Например:

a = {something: "Safe", other: "Foo"}
function hello(){
  var a = a.other; // Foo
  a.something; // Undefined
}
a.something; // Safe
a.other; // Foo

Проблема с приведенным выше кодом заключается в том, что когда я определяю var a в функции, он уже локально очистит значение глобального a перед его установкой;другими словами, он будет возвращать что-то вроде Can't access property [other] of undefined [a].

Опять же, a все равно должно быть a (поэтому использование другого имени переменной не является опцией или, по крайней мере, не идеальной).Фактически, глобальная a не должна быть доступной из функции hello.

Edit: window также будет перезаписана с nullОтносительно ответа Милана Ярича.

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 31 октября 2011

К каждому глобальному объекту можно получить доступ с помощью оконного объекта, с небольшим изменением вашего кода, вот пример

a = {something: "Safe", other: "Foo"}
function hello(){
  var a = window.a.other; // Foo
  console.log(window.a.something); // Safe
}
a.something; // Safe
a.other; // Foo

hello();

или

a = {something: "Safe", other: "Foo"}
function hello(){
  var a = this.a.other; // Foo
  delete a;
  console.log(this.a.something); // Safe
}
a.something; // Safe
a.other; // Foo

hello();
1 голос
/ 31 октября 2011

Допустим, это a, а его область действия глобальная.

Вы имеете в виду «a является глобальной переменной».

... для определенногофункция, я хочу установить значение этой переменной в нечто иное, чем ее глобальное значение, но на основе этого, и без изменения ее значения в глобальном масштабе.

Невозможно.Вы можете создать переменную с тем же именем, что и в цепочке областей действия, однако вы не можете условно создать свойства переменных объектов (т. Е. Объектов, используемых для разрешения идентификаторов в цепи областей действия).Вы можете объявить только локальные переменные, что означает, что они существуют до запуска любого кода и поэтому не могут быть условными, или вы можете напрямую назначить необъявленный идентификатор, после чего он становится глобальной переменной.

[snippedкод]

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

Код никоим образом не «очищает» значение a.Он создает локальную переменную a, чтобы идентификатор a преобразовывался в эту переменную, а не в глобальную a .Чтобы разграничить их, вы можете получить доступ к глобальному a как свойству глобального объекта:

var a = 'whatever';
var myFunction = (function(global) {
  return function() {
    var a;    // local a
    global.a; // global a
  }
}(this));

Опять же, a все равно должно быть (поэтому использование другого имени переменной не являетсявариант или хотя бы не идеальный).Фактически, глобальный a не должен быть доступен из функции hello.

Невозможно, хотя это может быть почти возможно в строгом режиме ES5, если код пытается получить доступ к глобальному a * 1033.* находится внутри другой функции и не может получить ссылку на глобальный объект.

Но я не думаю, что вы можете гарантировать это.

1 голос
/ 31 октября 2011

Это то, что я искал ... сейчас, прежде чем вы думаете, что я получил ответ, прежде чем я спросил, я не смог, я смог найти реальное решение только на основе ответа Милана Ярича (спасибо, кстати).

a = {something: "Safe", other: "Foo"}
function hello(b){
  var window = null;
  var a = b; // a.other;
  a.something; // Undefined
}
a.something // Safe
a.other // Foo

hello(a.other)

(я никогда не говорил, что может или не может выйти за пределы функции).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...