Изменение переменной вне области видимости? - PullRequest
4 голосов
/ 04 мая 2010

Есть ли способ изменить переменную, находясь вне области видимости? Я знаю, в общем, вы не можете, но мне интересно, есть ли какие-нибудь хитрости или переопределения. Например, есть ли способ заставить следующую работу:

function blah(){
 var a = 1
}
a = 2;
alert(blah());

РЕДАКТИРОВАТЬ (для уточнения):

Гипотетический сценарий будет модифицировать переменную, которая используется в функции setInterval, которая также находится вне области и в не редактируемом предыдущем файле JavaScript. Это довольно дурацкий сценарий, но о котором я собираюсь спросить.

Ответы [ 5 ]

3 голосов
/ 04 мая 2010

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

Единственный прием, который я могу придумать в отношении области видимости, - это использование window в браузере для доступа к глобальному объекту. Это может помочь вам добраться до «скрытой» переменной - той, которая находится в области видимости, но имя которой было заменено локальной переменной (или другой переменной, расположенной ближе в цепочке областей действия).

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

1 голос
/ 04 мая 2010

Вы можете вернуть значение из функции, конечно:

function blah() {
    var a=1;
    return a;
}

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

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

function blah1(v) {
    setInterval(function() {
       console.log("blah1 "+v);
    }, 500);
}
function blah2(v) {
    setInterval(function() {
       console.log("blah2 "+v.a);
    }, 500);
}

var a = 1;
var b = {a: 1};
blah1(a);
blah2(b);
setInterval(function() {
   a++;
}, 2000);
setInterval(function() {
   b.a++;
}, 2000);

Если вы запустите это в среде с консольным объектом, вы увидите, что значение, указанное в blah2, изменяется через 2 секунды, но blah1 просто продолжает использовать то же значение для v.

1 голос
/ 04 мая 2010

Я не понимаю, зачем вам это нужно, если вам нужна переменная, доступная извне, просто объявите ее снаружи.

Теперь, если вы спрашиваете об этом только потому, что пытаетесь чему-то научиться, хорошо для вас.

var a = 0;

function blah() {
    a = 1;
    return a;
}
a = 2;

alert(blah());
0 голосов
/ 04 мая 2010

Нет, это никогда не сработает, но вы можете использовать глобальные:

var a;
function blah(){
 a = 1
}
a = 2;
alert(blah());

или используйте замыкание:

function bleh() {
    var a;
    function blah(){
     a = 1
    }
    a = 2;
    alert(blah());
}

или вы можете передать его с возвратом (который ведет себя по-другому, но, вероятно, это то, что вы хотите сделать):

function blah(a){
 a = 1
 return a;
}
a = 2;
alert(blah(a));
0 голосов
/ 04 мая 2010

Функции могут обращаться к переменным, объявленным вне их области видимости, если они объявлены перед самой функцией:

var a = 0;
function blah() {
    a = 1;
}
a = 2;
alert(blah());

Обратите внимание, что при использовании var a внутри функции объявлена ​​локальная переменная с именем a; здесь мы опускаем ключевое слово, иначе оно будет скрывать a, как объявлено во внешней области видимости!

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