我很难理解为什么下面的代码打印 1 而不是 10。我以为console.log
会打印 10,因为如果变量没有在函数中声明,它就是全局范围的一部分。
如果我删除该行,function a(){}
,console.log
语句打印 10。有人可以解释为什么这条线的存在会影响a
的值.
此外,如果这个问题可以改进,我将不胜感激任何建议
function b() {
a = 10;
return;
function a(){}
}
var a = 1;
b();
console.log(a);
console.log(a);
添加到您的函数中,您就会意识到"a"是一个具有本地作用域的函数,这意味着它在函数 b(( 内部,不能真正从外部调用。因此,a 的值保持为 1,因为没有什么真正影响它。
function b() {
console.log(a);
a = 10;
return;
function a(){}
}
var a = 1;
b();
console.log(a);
函数声明创建局部变量,所有声明的变量都提升到其包含函数范围的顶部。因此,您具有等效于以下内容的内容:
function b() {
function a(){}
a = 10;
return;
}
这反过来大致相当于
function b() {
var a = function(){}
a = 10;
return;
}
正如你在这个形式中看到的,很明显a
是一个局部变量,所以a = 10
给局部a
赋值,而不是全局a
。
因为函数声明和变量在后台的处理方式相似。
调用函数时,首先解析其内容以配置堆栈帧以准备执行。
作为此过程的一部分,函数声明和变量作为标识符/值对插入到调用函数时创建的堆栈帧(执行上下文(内的相同数据结构(词法环境中的环境记录(中。
因此,通过在b
内部声明一个函数a
,您可以在为调用b
创建的环境记录中创建一个名为"a"的标识符,在外部上下文中隐藏a
。
因此,外部语境中的a
仍然1
.