返回

作用域的初次相遇-让我们成为朋友

前端

作用域简介

作用域是编程语言中一个重要的概念,它定义了变量和函数的可见范围。在 JavaScript 中,作用域分为全局作用域和局部作用域,局部作用域包括函数作用域和块级作用域。

  • 全局作用域 :全局作用域是整个程序都可以访问的变量和函数的作用域。在 JavaScript 中,全局作用域中的变量和函数可以使用 var 来声明。
  • 局部作用域 :局部作用域是函数或块级作用域内的变量和函数的作用域。在 JavaScript 中,局部作用域中的变量和函数可以使用 letconst 关键字来声明。

函数作用域

函数作用域是函数内部的变量和函数的作用域。在 JavaScript 中,函数作用域由函数的大括号 {} 定义。在函数作用域内声明的变量和函数只能在该函数内部访问,不能在函数外部访问。

function myFunction() {
  var x = 10;
  function innerFunction() {
    console.log(x);
  }
  innerFunction();
}

myFunction(); // 10
console.log(x); // ReferenceError: x is not defined

在上面的示例中,变量 x 和函数 innerFunction 都声明在函数 myFunction 的作用域内。因此,它们只能在函数 myFunction 内部访问,不能在函数外部访问。

块级作用域

块级作用域是使用大括号 {} 括起来的一块代码的作用域。在 JavaScript 中,块级作用域由 letconst 关键字来声明。在块级作用域内声明的变量和函数只能在该块级作用域内访问,不能在块级作用域外部访问。

if (true) {
  let x = 10;
  const y = 20;
}

console.log(x); // ReferenceError: x is not defined
console.log(y); // ReferenceError: y is not defined

在上面的示例中,变量 xy 都声明在块级作用域内。因此,它们只能在该块级作用域内访问,不能在块级作用域外部访问。

变量提升

变量提升是 JavaScript 中一个特殊的行为。在 JavaScript 中,变量声明会自动提升到函数或块级作用域的顶部。这意味着,变量声明可以出现在代码的任何位置,但它们会被解释为出现在代码的顶部。

console.log(x); // undefined
var x = 10;

在上面的示例中,变量 x 被声明在代码的第二行,但由于变量提升,它会被解释为出现在代码的第一行。因此,当 console.log(x) 执行时,x 的值是 undefined

闭包

闭包是指函数访问其父函数的作用域链的变量。在 JavaScript 中,函数可以在其父函数的作用域链中访问变量,即使该函数已经执行完毕。

function outerFunction() {
  var x = 10;

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

  return innerFunction;
}

var innerFunction = outerFunction();
innerFunction(); // 10

在上面的示例中,函数 innerFunction 可以访问其父函数 outerFunction 的变量 x,即使函数 outerFunction 已经执行完毕。这是因为函数 innerFunction 已经闭合了其父函数 outerFunction 的作用域链。

总结

作用域是编程语言中一个重要的概念,它定义了变量和函数的可见范围。在 JavaScript 中,作用域分为全局作用域和局部作用域,局部作用域包括函数作用域和块级作用域。了解作用域的概念对理解 JavaScript 代码的执行流程非常重要,也是面试中常被问及的问题。

希望本文对您有所帮助。如果您有任何问题,请随时留言。