2010-05-04 140 views
4

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

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

EDIT(澄清):

的假设的情况将被修改以setInterval函数中使用的变量,它也是出于范围和一个不可编辑的以前的JavaScript文件。这是一个非常古怪的场景,但这是我打算询问的。

回答

3

没有窍门或覆盖。您必须计划让这两个地方都能够在相同范围内看到变量。

我能想到关于范围的唯一技巧是在浏览器中使用window来获取全局对象。这可以帮助你得到一个“隐藏的”变量 - 一个在范围内,但其名称已被局部变量(或范围链中更接近的其他变量)超越的变量。

闭包和类可以给你提供一些其他范围的技巧,但没有一个允许你完全覆盖范围规则。

+0

感谢您的想法。如果其他人知道任何技巧,我会让问题坐下来一会儿。否则,这是正确的答案。谢谢。 – Matrym 2010-05-04 03:10:00

2

我不明白为什么你需要这样做,如果你需要一个可以从外部访问的变量,只需在外部声明它。

现在,如果你问这是因为你想学习一些东西,对你有好处。

var a = 0; 

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

alert(blah()); 
+2

点因为是的,我用一个古怪的场景瞎掰,你似乎已经意识到了) – Matrym 2010-05-04 03:02:20

0

函数可以访问自己的范围之内声明的变量,如果它们的功能本身之前宣称:

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

请注意,您的var a在函数内部使用声明的局部变量命名为;在这里,我们省略了关键字,否则它会隐藏a在外部范围中声明!

+0

糟糕,我错过了'return'关键字。 – 2010-05-04 02:54:17

+0

它们不需要在函数定义之前声明。 – 2010-05-04 02:57:53

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)); 
+0

你忘了返回 – Thielicious 2017-03-29 08:37:47

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的值。