作为一个前端工程师,你必须对JavaScript的作用域不陌生,传统常见的有函数级作用域,还有全局作用域,ES6 let const 的块级作用域,其实还有一个你不知道的块级作用域,今天小千就来给大家介绍一下。

我们先来看看下面这个段代码,请思考一下结果是什么。

想必你心中已经有了结果,答案是 3 2

你答对了吗?答案结果是否有些意外呢?

好了,我们来看看为什么会出现这个答案?首先我们需要先了解以下基本知识。

声明提前

声明提前指的是JS引擎在执行之前对代码进行的预解析(为了提高执行效率) 具体的来说就是使用(var)声明变量和(function)声明的函数正预编译阶段将其提升到了作用域的顶部

全局变量声明

函数作用域变量声明

函数声明

函数表达式声明

函数块级作用域

通过下面代码我们可以知道 变量的声明是没有块级作用域的,if语句块中声明的变量foo会提升到全局作用域并初始化值为undefined

我们再看看函数的情况

上面这个例子告诉我们 函数foo提升到了if语句块的顶部,但是没有提升到全局作用域的顶部。但全局作用域中存有一个名为foo的变量 在代码执行后同步成了函数foo

同步?为什么会有同步?我们来看看观察上帝视角的神器 ———— 断点调试。我这边监听了 foo 变量和 window.foo 大家请注意一下它的变化。同时我们也关注一下 Scope 作用域

我们看到Scope中只有全局作用域 foo和window.foo的只都是undefined

代码执行到if语句块中 我们再Scope中又发现了一个新的块级作用域 当前块级作用域foo的值被赋值为一个函数(函数提升) 而全局作用域中的foo依旧是undefined

代码继续往后执行 执行函数的赋值 block作用域依然存在 我把几个变量的值使用箭头进行了对应

神奇的地方来了 在函数执行赋值后 块级作用域消失 而全局变量的foo同步成了刚才块级作用域的foo

回归原题

我们对foo变量进行隔行输出 看看结果

结合上面断点测试的结果大家可以发现,函数在代码块中声明会提前到块级作用域顶部,预编译结束后开始执行代码 在执行阶段任然会执行函数的赋值操作,其实是函数赋值的第二次执行(第一次在预编译阶段) 第二次的赋值执行的意义是确认当前 函数/全局 作用域能准确的检索到函数 所以讲函数同步到了 当前的函数或全局作用域中。

好了本次解析就到这里,还有不明白的小伙伴可以copy代码去进行断点测试,相信很快你能理解其中奥秘。

本文来自千锋教育,转载请注明出处。

web前端教程之JavaScript的作用域相关推荐

  1. 好程序员前端教程之JavaScript闭包和匿名函数的关系详解...

    好程序员前端教程之JavaScript闭包和匿名函数的关系详解 本文讲的是关于JavaScript闭包和匿名函数两者之间的关系,从匿名函数概念到立即执行函数,最后到闭包.下面一起来看看文章分析,希望你 ...

  2. javascript技术教程蔡敏_程序员都必掌握的前端教程之JavaScript基础教程(上)

    阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到. 本篇文章成哥继续带大家来学习前端教程之JavaScript,网页的动态事件基本上都是靠它来实现的.下面我们就一起来学习内容吧! 01 Ja ...

  3. web程序前后台功能实现_好程序员web前端教程之JS继承实现方式解析

    好程序员web前端教程之JS继承实现方式解析,JS是Web前端三要素之一,也是每一个初学前端的同学遭遇的第一条拦路虎.很多人反应JS学习不易,各类知识点概念及应用常常让人抓耳挠腮.在接下来的北京Web ...

  4. 前端html继承的方式,好程序员web前端教程之JS继承实现方式解析

    好程序员 web 前端教程 之JS 继承实现方式解析 , JS 是 Web 前端三要素之一,也是每一个初学前端的同学遭遇的第一条拦路虎.很多人反应 JS 学习不易,各类知识点概念及应用常常让人抓耳挠腮 ...

  5. thymeleaf加载不了js引用_web前端教程之js中的模块化一

    web前端教程之js中的模块化一:我们知道最常见的模块化方案有CommonJS.AMD.CMD.ES6,AMD规范一般用于浏览器,异步的,因为模块加载是异步的,js解释是同步的,所以有时候导致依赖还没 ...

  6. web前端知识集合——javascript基础篇之常量和变量(二)

    3. 变量和常量: 1.1 变量的声明: js三种方式声明变量,声明不赋值时,默认值为underfined. (1)var声明:var name='Ace',同时声明多个变量var a=1,b=2,c ...

  7. 好程序员web前端教程分享JavaScript验证API

    好程序员web前端教程分享JavaScript验证API,小编每天会分享一下干货给大家.那么今天说道的就是web前端培训课程中的章节. JavaScript验证API 约束验证DOM方法 Proper ...

  8. 好程序员web前端分享使用JavaScript正则表达式如何去掉双引号

    为什么80%的码农都做不了架构师?>>>    好程序员web前端分享使用JavaScript正则表达式如何去掉双引号,最近接了一个项目,项目需求需要用js正则表达式过滤掉页面文本域 ...

  9. 好程序员Web前端教程分享JavaScript开发技巧

    好程序员Web前端教程分享JavaScript开发技巧,相信知道Web前端的小伙伴都熟悉,Javascript的很多扩展的特性是的它变得更加的犀利,同时也给予程序员机会创建更漂亮并且更让用户喜欢的网站 ...

最新文章

  1. 高通总裁:物联网和云计算正改变游戏规则
  2. 5G 标准的走向,为何越来越不同寻常?
  3. Oracle Compile 编译 无效对象(ORA-04063: package body SYS.DBMS_XPLAN 有错误)
  4. python中自定义函数如何传递动态参数_python 函数的动态参数
  5. dorado 刷新_5.dorado查询开发:使用flushData方法 (T1)
  6. 李宏毅机器学习课程12~~~半监督学习
  7. python_fullstack基础(十一)-常用模块
  8. JUNIT Hello World
  9. 百度Apollo赋能的威马W6,自主泊车体验如何?
  10. python爬取王者_python 爬取王者荣耀高清壁纸
  11. [Python] 学习资料汇总
  12. java程序员入职自我介绍,看完直接跪服
  13. LCD1602芯片的使用——简单易懂
  14. 通信线路工程验收规范_老杨一建通信学堂通信线路工程施工技术
  15. 访问服务器共享文件夹慢,win8系统访问共享时复制文件速度慢的解决方法
  16. C语言 吃鱼还是吃肉
  17. vue3 全局注册app.config.globalProperties, 如何处理getCurrentInstance 上下文线上环境报错
  18. c#利用log4记录日志
  19. Kaggle赛题解析:Google手语识别
  20. 扬帆志远:shopee电商海外本土化趋势是大势所趋

热门文章

  1. 【Markdown编辑器】LaTeX公式教程
  2. python画一个点_pygame学习笔记(2):画点的三种方法和动画实例
  3. IDEA主题设置(字体颜色背景)
  4. Mybatis更新和删除数据
  5. Spring Boot——集成Swagger2
  6. Spring Boot——配置Spring Security配置类DEMO
  7. Spring Boot——自定义多个拦截器(HandlerInterceptor)配置方法与执行顺序
  8. elasticsearch-7.3安装
  9. postgresql操作
  10. Spring-Kafka消费者源码阅读笔记