繁体   English   中英

JavaScript范围:全局变量混淆

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM