Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.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_Global Variables_Scope - Fatal编程技术网

Javascript中的变量范围(提升)

Javascript中的变量范围(提升),javascript,global-variables,scope,Javascript,Global Variables,Scope,我的一个朋友正在参加一个在线测验,他问了我一个我无法回答的问题 var global = false; function test() { global = true; return false; function global() {} } console.log(global); // says false (As expected) test(); console.log(global); // says false (Unexpected: should be true)

我的一个朋友正在参加一个在线测验,他问了我一个我无法回答的问题

var global = false;

function test() {
  global = true;
  return false;
  function global() {}
}

console.log(global); // says false (As expected)
test();
console.log(global); // says false (Unexpected: should be true)
如果我们假设函数与var变量一起挂在顶部,那么让我们试试这个

var foo = 1;
function bar() {
    return foo;
    foo = 10;
    function foo() {}
    var foo = 11;
}

bar();
console.log(foo); //says 1 (But should be 11) Why 1 this time ??
这是一个可以玩的游戏


PS:如果我们从
test()
中删除
function global(){}
,那么它运行良好。有人能帮我理解为什么会发生这种情况吗?

var
语句和函数声明语句被“提升”到其封闭范围的顶部。
因此,函数中的
function global(){}
会创建一个本地
global
名称

在函数中分配给
global
将绑定到此本地名称。以下是如何使用提升“重写”它,以了解编译器是如何看待它的:

function test() {
    var global = function() {};   // hoisted; 'global' now local
    global = true;
    return false;
}

我会回答你问题的第二部分

如果我们假设函数与var变量一起被提升到顶部

bar();
console.log(foo); //says 1 (But should be 11) Why 1 this time ??
您应该尝试
console.log(bar());console.log(foo)取而代之。然而,提升对您的功能的影响是:

function bar() {
    var foo;
    function foo() {}
    return foo;
    foo = 10;
    foo = 11;
}

因此,您应该期望返回函数,因为变量赋值在
return
语句之后。而
var
和函数声明都使
foo
成为局部变量,因此全局
foo=1
永远不会改变;这就是吊装的意思。不,不应该。按照OP所写的方式分配的函数,将始终按照答案所说的那样被提升。@^这就是我所想的。@几年前,这篇文章让我大开眼界,我只是想与大家分享;)我没有在编辑中添加答案,因为@SLaks的答案仍然适用
var foo=11
在该函数的本地范围内
foo=10
被忽略,
function foo()
仍在创建一个局部作用域变量foo,并且
var foo
bar()返回function@DavidBarker是的,我现在明白了。感谢您为Slak的答案添加的漂亮插件。请注意,函数中的
global
变量实际上是本地变量……您也可以通过Chrome开发工具逐步完成此过程。感谢您的解释+我现在明白了。沃德的那篇文章真的帮了我的忙。我不知道JS world+1中是否存在起重这样的东西