[英]JavaScript Scope: Global Variable Confusion
我很难理解为什么以下代码显示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
。
调用函数时,首先会解析其内容以配置准备好执行的堆栈框架。
作为此过程的一部分,函数声明和变量将作为标识符/值对插入到调用函数时创建的堆栈框架(执行上下文)内的相同数据结构(词法环境内的环境记录)中。
因此,通过声明一个函数a
内部b
,创建名为标识符“一”中的环境记录创造了调用b
,遮蔽a
在外部环境。
所以a
在外的情况依然1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.