Javascript 将变量更改为超出范围?
有没有办法在变量超出范围时更改它?我知道一般来说,你不能,但我想知道是否有任何技巧或覆盖。例如,是否有任何方法可以使以下工作正常进行:Javascript 将变量更改为超出范围?,javascript,variables,scope,Javascript,Variables,Scope,有没有办法在变量超出范围时更改它?我知道一般来说,你不能,但我想知道是否有任何技巧或覆盖。例如,是否有任何方法可以使以下工作正常进行: function blah(){ var a = 1 } a = 2; alert(blah()); 编辑(澄清): 假设的场景是修改setInterval函数中使用的变量,该函数也不在范围内,并且在以前不可编辑的javascript文件中使用。这是一个非常奇怪的场景,但我想问的就是这个场景。我不明白为什么需要这样做,如果您需要一个可以从外部访问的变量,只需
function blah(){
var a = 1
}
a = 2;
alert(blah());
编辑(澄清):
假设的场景是修改setInterval函数中使用的变量,该函数也不在范围内,并且在以前不可编辑的javascript文件中使用。这是一个非常奇怪的场景,但我想问的就是这个场景。我不明白为什么需要这样做,如果您需要一个可以从外部访问的变量,只需在外部声明它即可 现在,如果你问这个仅仅是因为你想学点东西,对你有好处
var a = 0;
function blah() {
a = 1;
return a;
}
a = 2;
alert(blah());
函数可以访问在其作用域之外声明的变量,如果这些变量是在函数本身之前声明的:
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() {
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);
如果您在具有console对象的环境中运行此操作,您将看到blah2中报告的值在2秒后发生更改,但blah1继续使用相同的v值。Oops,我遗漏了
return
关键字。它们不需要在函数定义之前声明。指向上,因为是,我在胡闹一个古怪的场景,你似乎已经意识到了;)谢谢你的主意。我将让这个问题暂时搁置一会儿,以防其他人知道任何把戏。否则,这就是正确答案。谢谢,你忘了回来
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);