JavaScript 范围:全局变量混淆



我很难理解为什么下面的代码打印 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.

最新更新