Замена переменной из объема?

Там какой-либо путь состоит в том, чтобы заменить переменную в то время как из объема? Я знаю в целом, Вы не можете, но я задаюсь вопросом, существуют ли какие-либо приемы или переопределения. Например, есть ли любой способ сделать следующую работу:

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

РЕДАКТИРОВАНИЕ (для разъяснения):

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

5
задан Matrym 4 May 2010 в 03:00
поделиться

5 ответов

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

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

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

3
ответ дан 14 December 2019 в 19:06
поделиться

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

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
ответ дан 14 December 2019 в 19:06
поделиться

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

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

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

0
ответ дан 14 December 2019 в 19:06
поделиться

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

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
ответ дан 14 December 2019 в 19:06
поделиться

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

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

var a = 0;

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

alert(blah());
1
ответ дан 14 December 2019 в 19:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: