返回

名词和作用域

见解分享

在了解变量的作用域之前,首先需要理解什么是“名词”。所谓名词,在JavaScript中是指变量、函数和其他标识符。一个名词总是引用一个值,这些值可能是基本值(如数字或字符串)或复杂的值(如数组或对象)。作用域则定义了变量或函数可以被引用的代码范围。

变量声明

变量声明是声明一个变量并为其分配初始值的语句。变量声明通常使用var、let或const,例如:

// 使用var声明变量
var x = 10;

// 使用let声明变量
let y = 20;

// 使用const声明常量
const z = 30;

在JavaScript中,变量声明在函数体内或全局作用域中进行。如果变量声明在函数体内,则该变量只能在函数体内被引用。如果变量声明在全局作用域中,则该变量可以在代码的任何地方被引用。

函数声明

函数声明是声明一个函数并为其分配函数体的语句。函数声明通常使用function关键字,例如:

function add(a, b) {
  return a + b;
}

函数声明可以出现在代码的任何地方,但通常会放在文件顶部或单独的文件中。函数声明在执行时会创建一个函数对象,该函数对象可以在代码的任何地方被引用。

词法作用域

JavaScript使用词法作用域,这意味着变量和函数的作用域由它们在代码中的位置决定。词法作用域是指变量和函数的作用域由其在源代码中的位置决定,而不是由它们在运行时的执行顺序决定。因此,在函数内部声明的变量和函数只能在该函数内部被引用,而在函数外部声明的变量和函数可以在任何地方被引用。

动态作用域

动态作用域是指变量和函数的作用域由它们在运行时的执行顺序决定。在动态作用域中,变量和函数的作用域由它们在函数调用堆栈中的位置决定。因此,在函数内部声明的变量和函数只能在该函数内部以及该函数调用的函数内部被引用。

闭包

闭包是指一个函数可以访问它外部作用域中的变量和函数。闭包在JavaScript中很常见,并且可以用来创建私有变量和函数。闭包也可以用来创建高阶函数,高阶函数是指一个函数可以接受另一个函数作为参数或返回另一个函数。

实例

// 外部函数
function outer() {
  // 外部变量
  var x = 10;

  // 内部函数
  function inner() {
    // 内部变量
    var y = 20;

    // 访问外部变量
    console.log(x); // 10

    // 访问内部变量
    console.log(y); // 20
  }

  // 调用内部函数
  inner();
}

// 调用外部函数
outer();

在这个例子中,变量x在外部函数中声明,变量y在内部函数中声明。当调用内部函数inner()时,它可以访问外部函数outer()中声明的变量x。这是因为内部函数inner()闭包了外部函数outer()的变量x。