JavaScript 的作用域定义了变量和函数的可访问范围。作用域分为全局作用域和局部作用域(也叫函数作用域)。在函数内部声明的变量通常只在该函数内部可见,而在全局作用域中声明的变量则可以在整个代码中访问。

1. 全局作用域:

在全局范围内声明的变量拥有全局作用域,即它们可以在整个代码中访问。
var globalVar = "I am a global variable";

function globalFunction() {
    console.log(globalVar);
}

globalFunction(); // 输出 "I am a global variable"

2. 局部作用域:

在函数内部声明的变量拥有局部作用域,即它们只能在函数内部访问。
function localFunction() {
    var localVar = "I am a local variable";
    console.log(localVar);
}

localFunction(); // 输出 "I am a local variable"
// console.log(localVar); // 这里会报错,因为 localVar 不在这个作用域内

3. 块级作用域(ES6引入):

在使用 let 或 const 声明变量时,它们会拥有块级作用域,即在代码块(如 {})内部声明的变量只能在该块内部访问。
if (true) {
    let blockVar = "I am a block-scoped variable";
    console.log(blockVar);
}

// console.log(blockVar); // 这里会报错,因为 blockVar 不在这个作用域内

4. 函数作用域和变量提升:

在 JavaScript 中,函数作用域指的是函数内声明的变量在整个函数内部都是可见的。另外,JavaScript 存在变量提升,即在函数内部的任何位置声明的变量都会被提升到函数的顶部,但是它们的赋值并不会提升。
function example() {
    console.log(myVar); // 输出 undefined,而不是报错
    var myVar = 42;
    console.log(myVar); // 输出 42
}

example();

5. 闭包与作用域链:

闭包是指函数可以访问其声明外部的变量,即使在外部函数执行完毕后仍然可以访问这些变量。这是由于 JavaScript 中的作用域链机制。
function outerFunction() {
    var outerVariable = "I am from outer function.";

    function innerFunction() {
        console.log(outerVariable);
    }

    return innerFunction;
}

var closure = outerFunction();
closure(); // 输出 "I am from outer function."

以上是关于 JavaScript 作用域的基础知识。理解作用域是编写正确、可维护和可读代码的重要一环。


转载请注明出处:http://www.pingtaimeng.com/article/detail/12782/JavaScript