likes
comments
collection
share

前端入门必备知识:javascript的作用域

作者站长头像
站长
· 阅读数 25

作用域基础知识

各位小伙伴好~

今天在学习js作用域的时候,感觉这个知识点比较难以理解,因此,写这篇文章简单记录一下!如果有问题,请大家多多指教哦!

什么是作用域

JavaScript中的作用域 ,是指变量函数或者对象的作用范围。简单来说,就是指某个变量、函数或者对象在一个特定的执行环境中可以被访问,但一旦超出这个执行环境就无法被访问。

<script>
  function test() {
    var a = 1;
    console.log(a);  // 1
  }
  test();
  console.log(a); //  a is not defined
</script>

作用域的分类

JavaScript中的作用域可以根据执行环境的不同可以分为以下两种:

  • 全局作用域
  • 局部作用域

ECMASCript6新增了块级作用域。

全局作用域

在全局作用域定义的变量、函数或者对象在任意位置都可以访问;全局作用域在页面打开时创建,在页面关闭时销毁。

直接编写早script标签中的代码,都在全局作用域:

如下面定义的变量a、b,函数c都是全局作用域下

    <script>
      var a = 2;
      var b = 3;
      function c() {
        console.log("作用域");
      }
    </script>

全局作用域中有一个全局对象window,它代表浏览器窗口,可以直接使用:

    <script>
      console.log(window); // Window {window: Window, ...}
    </script>

在全局作用域中,创建的变量都会作为window的属性保存,创建的方法也会被挂载到window上:

    <script>
      var a = 2;
      var b = 3;
      function c() {
        console.log("作用域");
      }
      console.log(window.a); // 2
      console.log(window.b); //3
      console.log(window.c); //Function
    </script>

注意,es6中引入了const和let,如果使用const和let声明变量,在全局作用域中,它们将不在被作为全局变量使用。

    <script>
      const a = 2;
      let b = 3;
      console.log(window.a); // undefined
      console.log(window.b); // undefined
    </script>

局部作用域

在函数内部或者代码块的内部定义的变量、函数或者对象只能在当前函数内部或者代码块的内部访问。

function showDevices() {
  let device = "小米"; // 局部变量
  console.log(device); // 输出:小米
}

showDevices();
console.log(device); // 报错:device is not defined

在这个示例中,变量 device 是在 showDevices 函数内部定义的,因此只能在该函数内部使用,函数外部访问会导致错误。

作用域链

JavaScript 中的作用域是有层级关系的,称为作用域链。当在某个作用域中查找变量时,JavaScript 会沿着作用域链向上查找,直到找到变量或到达全局作用域为止。

let fruit = "苹果"; // 全局变量

function outerFunction() {
  let color = "红色"; // 外部函数变量

  function innerFunction() {
    let taste = "甜"; // 内部函数变量
    console.log(fruit); // 输出:苹果
    console.log(color); // 输出:红色
    console.log(taste); // 输出:甜
  }

  innerFunction();
}

outerFunction();

在这个例子中,innerFunction 可以访问 outerFunction 中的 color 变量以及全局的 fruit 变量,而 outerFunction 不能访问 innerFunction 中的 taste 变量。

闭包

闭包是 JavaScript 中一个非常重要的概念,指的是一个函数可以“记住”并访问其词法作用域,即使函数是在其词法作用域之外执行的。

function createCounter() {
  let count = 0; // 局部变量

  return function() {
    count += 1; // 访问外部函数的变量
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // 输出:1
console.log(counter()); // 输出:2
console.log(counter()); // 输出:3

在这个示例中,createCounter 函数返回一个内部函数,而这个内部函数可以访问 count 变量,即使 createCounter 函数已经执行完毕。

总结

通过全局作用域、局部作用域和作用域链的学习,大家可以更好地处理变量,避免潜在的问题。希望大家能灵活运用这些知识,在前端开发中游刃有余!

感谢大家的阅读,如有不妥之处,请多多指教哦!

转载自:https://juejin.cn/post/7393195128955682850
评论
请登录