当前位置: 首页 > news >正文

JavaScript 变量作用域与函数调用机制:var 示例详解

JavaScript 变量作用域与函数调用机制:var 示例详解

在 JavaScript 中,作用域和闭包是理解变量生命周期和行为的核心概念。通过以下这段代码,我们将详细分析如何在不同的作用域内使用 var 关键字,并解释相关的变量访问规则

代码解析

var name = "Hello, World"; // 1. 全局作用域中定义了 name,值为 "Hello, World"function echo() {console.log(name);  // 2. 输出 name 的值
}function env() {var name = "hello, kitty"; // 3. 在 env 函数内定义了局部变量 nameecho(); // 4. 调用 echo 函数
}env(); // 5. 调用 env 函数

执行流程

  • 全局作用域

    • 在全局作用域中,var name = “Hello, World” 赋值了一个全局变量 name,其值为 “Hello, World”
      var name = "Hello, World";
    
  • 定义函数 echo()

    • 函数 echo 定义了一个 console.log(name),该函数用于输出 name 变量的值
      var name = "Hello, World";
    
  • 定义函数 env()

    • 函数 env 内部首先声明了一个局部变量 name,并赋值为 “hello, kitty”。这个 name 变量只在 env 函数内部有效。
    • 然后,env 函数调用了 echo()
     function env() {var name = "hello, kitty";echo();}
    
  • 调用 env() 函数

    • 当 env() 被调用时,JavaScript 会执行 env 函数中的代码
    • 在 env() 内部,name 被声明为 “hello, kitty”,但是在调用 echo() 时,echo() 函数会输出 name,此时发生了作用域链的查找

关键点:作用域链(Scope Chain) 和 函数调用时的作用域

  • echo() 函数中的 name 是在全局作用域中查找的,因为 echo() 是在全局作用域中定义的。当 echo() 被调用时,它会首先在自己所在的作用域中查找 name,如果没有找到,就会继续在外部作用域中查找(即查找全局作用域)
  • 局部变量 name(在 env() 内部定义的 name)只对 env() 函数有效,对 echo() 函数没有影响
    • 由于 echo() 没有在其作用域内找到 name,它就会在外部的作用域中查找。在此情况下,echo() 找到了全局作用域中的 name,其值为 “Hello, World”

作用域链: echo() 函数查找 name 时,会首先查看其自己的作用域,然后查看外层作用域(直到全局作用域)。env() 中的局部 name 对 echo() 的执行没有影响,因为 echo() 查找的是全局作用域中的 name。

总结

  • 作用域链的概念: JavaScript 中的函数作用域遵循词法作用域规则,变量的查找顺序是从当前函数的作用域开始,依次向外查找,直到全局作用域为止。

  • 全局与局部变量的关系: 即使在一个函数内部声明了与全局变量同名的局部变量,这个局部变量仅对函数内部有效。函数外部的同名变量(如果有)不会被覆盖。

  • var 和作用域: 使用 var 声明的变量在其作用域内有效,如果函数内有同名变量,局部变量会覆盖函数内部的代码,但不会影响外部作用域中的变量


http://www.mrgr.cn/news/66502.html

相关文章:

  • yolov8涨点系列之引入CBAM注意力机制
  • 这个开源项目牛逼,集成了多款短信通道,让发送短信变的更简单!(带私活源码)
  • 信息技术的发展趋势与挑战
  • vue3如果ul的li太多展示不了,展示滑动scroll
  • 一文详解开源ETL工具Kettle!
  • 前端部署到Nginx服务器后产生的一些问题原因,如请求接口报错,或刷新页面后报500错误……
  • SEO
  • 一个最简单的网络编程
  • OpenID Connect 和 OAuth 2.0 有什么不同?
  • Java继承练习
  • C++《list的模拟实现》
  • 通讯录(静态)
  • js基础篇笔记 (万字速通)
  • 【安装配置教程】二、VMware安装并配置ubuntu22.04
  • Kane-Mele X4Y2Z6材料自旋电子和谷电子理论研究
  • CSS的配色
  • 【数据分享】1981-2024年我国逐日平均气温栅格数据(免费获取)
  • 网络学习笔记---客户端和服务端
  • FBX福币交易所A股三大指数小幅低开 稀土永磁板块回调
  • Oracle OCP认证考试考点详解082系列12
  • 简易CPU设计入门:译码模块(一)
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-14
  • MySQL学习正式篇
  • 深度学习模块创作(缝合)教程|适合1-360月小宝宝食用,干货满满
  • Java基础-集合
  • 【保姆级教程】使用 oh-my-posh 和 clink 打造个性化 PowerShell 和 CMD