更改范围外的变量?

时间:2010-05-04 02:49:27

标签: javascript variables scope

有没有办法在超出范围时更改变量?我知道,一般情况下,你不能,但我想知道是否有任何技巧或覆盖。例如,有没有办法进行以下工作:

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

编辑(澄清):

假设场景将修改setInterval函数中使用的变量,该函数也超出范围并且位于不可编辑的先前javascript文件中。这是一个非常古怪的场景,但这是我打算提出的问题。

5 个答案:

答案 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));