Там какой-либо путь состоит в том, чтобы заменить переменную в то время как из объема? Я знаю в целом, Вы не можете, но я задаюсь вопросом, существуют ли какие-либо приемы или переопределения. Например, есть ли любой способ сделать следующую работу:
function blah(){
var a = 1
}
a = 2;
alert(blah());
РЕДАКТИРОВАНИЕ (для разъяснения):
Гипотетический сценарий изменил бы переменную, которая используется в функции setInterval, которая является также вне объема и в недоступном для редактирования предыдущем файле JavaScript. Это - довольно дурацкий сценарий, но это - то, о котором я намереваюсь спросить.
Нет. Никаких трюков или переопределений. Вы должны спланировать так, чтобы оба места могли видеть переменную в одной и той же области видимости.
Единственный трюк, который я могу придумать относительно области видимости, это использование window
в браузере, чтобы добраться до глобального объекта. Это может помочь вам добраться до "скрытой" переменной - той, которая находится в области видимости, но чье имя было поглощено локальной переменной (или другой переменной, расположенной ближе в цепочке областей видимости).
Замыкания и классы могут позволить вам некоторые другие трюки с областью видимости, но ни один из них не позволяет вам полностью отменить правила определения области видимости.
Вы, конечно, можете вернуть значение из функции:
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.
Функции могут обращаться к переменным, объявленным вне их области видимости, если они объявлены перед самой функцией:
var a = 0;
function blah() {
a = 1;
}
a = 2;
alert(blah());
Обратите внимание, что вы используете var a
внутри функции, объявленной локальной переменной с именем a; здесь мы опускаем ключевое слово, иначе оно скроет a
, как объявлено во внешней области видимости!
Нет, это никогда не сработает, но вы можете использовать глобальную переменную:
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));
Я не понимаю, зачем вам это нужно, если вам нужна переменная, доступная извне, просто объявите ее снаружи.
Теперь, если вы спрашиваете об этом только потому, что пытаетесь чему-то научиться, хорошо для вас.
var a = 0;
function blah() {
a = 1;
return a;
}
a = 2;
alert(blah());