javascript中return语句之后执行的代码?
我在网上发现了以下短JavaScript片段: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() {
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我把它改写为最长的,我接受了这个正确的答案,因为它是最全面的。谢谢@马辛瓦西莱夫斯基,我会把它改写成最长的。