有没有办法在超出范围时更改变量?我知道,一般情况下,你不能,但我想知道是否有任何技巧或覆盖。例如,有没有办法进行以下工作:
function blah(){
var a = 1
}
a = 2;
alert(blah());
编辑(澄清):
假设场景将修改setInterval函数中使用的变量,该函数也超出范围并且位于不可编辑的先前javascript文件中。这是一个非常古怪的场景,但这是我打算提出的问题。
答案 0 :(得分:3)
没有。没有技巧或覆盖。您必须计划让两个地方都能够在同一范围内看到该变量。
我能想到的关于范围的唯一技巧是在浏览器中使用window
来获取全局对象。这可以帮助您获得一个“隐藏”变量 - 一个在范围内但其名称已被局部变量(或在范围链中更近的其他变量)所取代的变量。
闭包和类可以为你提供一些范围的其他技巧,但没有一个可以让你完全覆盖范围规则。
答案 1 :(得分:1)
我不明白为什么你需要这样做,如果你需要一个可以从外面访问的变量,只需在外面声明它。
现在,如果你只是因为想要学习一些东西而这样做,那对你有好处。
var a = 0;
function blah() {
a = 1;
return a;
}
a = 2;
alert(blah());
答案 2 :(得分:1)
您可以从函数返回值:
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值继续。
答案 3 :(得分:0)
如果函数在函数本身之前声明,函数可以访问在其作用域之外声明的变量:
var a = 0;
function blah() {
a = 1;
}
a = 2;
alert(blah());
请注意,您在函数内部使用var a
声明了一个名为a的局部变量;在这里,我们省略了关键字,否则它将隐藏在外部范围中声明的a
!
答案 4 :(得分:0)
不,这将永远不会奏效,但你可以使用全球:
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));