Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将变量更改为超出范围?_Javascript_Variables_Scope - Fatal编程技术网

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