javascript中return语句之后执行的代码?

javascript中return语句之后执行的代码?,javascript,return,evaluation,Javascript,Return,Evaluation,我在网上发现了以下短JavaScript片段: var foo = 1; function bar() { foo = 10; return; function foo() {} } bar(); console.log(foo); 我希望函数bar()中return语句之后的内容被忽略,变量foo在末尾等于10。然而,令我惊讶的是,控制台输出了一些非常不同的东西: 1 现在,当我删除return语句后的行时 var foo = 1; function bar() {

我在网上发现了以下短JavaScript片段:

var foo = 1;
function bar() {
    foo = 10;
    return;
    function foo() {}
}
bar();
console.log(foo);
我希望函数bar()中return语句之后的内容被忽略,变量foo在末尾等于10。然而,令我惊讶的是,控制台输出了一些非常不同的东西:

1
现在,当我删除return语句后的行时

var foo = 1;
function bar() {
    foo = 10;
    return;
}
bar();
console.log(foo);
控制台按预期打印出:

10

有人能解释一下是什么导致foo在以前版本的代码中返回1吗?

函数声明被提升到其包含上下文的顶部。实际上,您正在
函数顶部创建一个
var foo

栏中操作的
foo
是该函数的本地函数,不会影响全局上下文的
foo


函数声明被提升到其包含上下文的顶部。实际上,您正在
函数顶部创建一个
var foo

栏中操作的
foo
是该函数的本地函数,不会影响全局上下文的
foo


这是由于
吊装造成的

编译器基本上会将其转换为:

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

因此,在分配之前有一个本地
foo
,您只覆盖本地。功能
foo()
也将随之消失。

这是由于
提升

编译器基本上会将其转换为:

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

因此,在分配之前有一个本地
foo
,您只覆盖本地。函数
foo()
也将消失。

这是因为代码被转换为

var foo = 1;
function bar() {
    var foo;
    foo = 10;
    return;
    function foo() {}
}
bar();
console.log(foo);

这是因为JavaScript总是将变量声明而不是初始化移动到作用域的顶部。

这是因为代码转换为

var foo = 1;
function bar() {
    var foo;
    foo = 10;
    return;
    function foo() {}
}
bar();
console.log(foo);

这是因为JavaScript总是将变量声明而不是初始化移动到作用域的顶部;dr这取决于函数表达式和函数声明的工作方式(还有函数提升):

更详细的答复:

在代码中添加以下console.log将帮助您可视化正在发生的事情,并且我认为可以回答您的问题

var foo = 1;
console.log('0', foo)
function bar() {
    console.log('1', foo)
    foo = 10;
    console.log('2', foo)
    return;
    console.log('3', foo)
    function foo() {}
    console.log('4', foo)
}
console.log('5', foo)
bar();
console.log('6', foo)
结果如下:

'0' 1
'5' 1
'1' function foo() {}
'2' 10
'6' 1
因此,让您怀疑,console.log('3',foo)和console.log('4',foo)永远不会在return语句之后被调用,这是意料之中的。您现在的问题可能是“为什么我的console.log('1',foo)被分配给函数foo(){}”,这可以用下面描述函数声明和函数表达式的SO问题来回答,即

function foo(){}
vs

基本上,当执行
bar
时,
foo
的直接定义变成function(){},但这里的关键概念是
foo
的定义在
bar()
函数中是局部的,在
bar
的范围之外,它仍然被分配给1


函数声明和表达式的另一个好读物:

tl;dr这取决于函数表达式和函数声明的工作方式(还有函数提升):

更详细的答复:

在代码中添加以下console.log将帮助您可视化正在发生的事情,并且我认为可以回答您的问题

var foo = 1;
console.log('0', foo)
function bar() {
    console.log('1', foo)
    foo = 10;
    console.log('2', foo)
    return;
    console.log('3', foo)
    function foo() {}
    console.log('4', foo)
}
console.log('5', foo)
bar();
console.log('6', foo)
结果如下:

'0' 1
'5' 1
'1' function foo() {}
'2' 10
'6' 1
因此,让您怀疑,console.log('3',foo)和console.log('4',foo)永远不会在return语句之后被调用,这是意料之中的。您现在的问题可能是“为什么我的console.log('1',foo)被分配给函数foo(){}”,这可以用下面描述函数声明和函数表达式的SO问题来回答,即

function foo(){}
vs

基本上,当执行
bar
时,
foo
的直接定义变成function(){},但这里的关键概念是
foo
的定义在
bar()
函数中是局部的,在
bar
的范围之外,它仍然被分配给1


关于函数声明和表达式的另一本好书:

我认为这是正确的答案,因为它是最全面的。谢谢@MarcinWasilewski我把它改写为最长的,我接受了这个正确的答案,因为它是最全面的。谢谢@马辛瓦西莱夫斯基,我会把它改写成最长的。