JavaScript中的本地作用域是什么?局部作用域与功能作用域有何不同?

Big*_*bob 1 javascript scope

我对编码很陌生,对本地作用域与函数作用域和块作用域之间的差异感到困惑。

我知道全局作用域是在函数外部声明变量时可以在任何地方访问的范围。函数作用域是指变量可以在函数内的任何位置访问,而块作用域是指变量可以在一组花括号内访问,例如{let a = block scope}

但是,我很困惑。什么是本地范围?局部作用域和功能作用域是一样的吗?

任何帮助都感激不尽

T.J*_*der 7

“局部作用域”是所有非全局作用域的统称,因此它包括函数作用域和块作用域(以及模块作用域)。

过去,JavaScript仅具有功能范围和全局范围。从ES2015开始,它还具​​有,和声明的块作用域let,以及“模块作用域”(模块的顶级作用域)和作用域(详细信息如下)。constclassfor

这是一个例子:

// Assume this code is not in a module and is at the top level

let a; // Global scope

function example() {
    let b; // function scope (a kind of local scope)

    for (let n = 0; n < 2; ++n) { // `n` is in local scope for the `for` (a kind of local scope)
        let c = n * 2; // block scope (a kind of local scope)
    }

    // This is a freestanding block, they don't *have* to be attached to anything
    {
        let d; // block scope (a kind of local scope)
    }
}
Run Code Online (Sandbox Code Playgroud)

这将是一样的,如果这一个模块中的不同之处在于let a不会在全球范围内,这将是在模块范围内。

可能值得一提的是,letfor循环初始化程序中包含声明的范围与附加到for具有has的任何块的范围并不完全相同。前者是后者的父作用域,有时a for没有附加块:

for (let n = 0; n < 0; ++n)
    console.log(n);
Run Code Online (Sandbox Code Playgroud)

以上范围n是不明显的。它的作用域是for循环,但是以一种非常有趣的方式:n为每次循环迭代创建一个新对象。因此,对于第一个插值,有一个n其值为0。然后,创建一个 n的,获取旧n值的副本,然后递增;然后将该新n变量用于下一个循环迭代。这对于循环闭合很方便。