inputstream重新赋值之前需要close吗_变量提升真的搞懂了吗?打脸的一道题

变量提升真的搞懂了吗?打脸的一道题

我们知道JS代码在执行之前,会做一系列的事情,其中就包括变量提升,原本以为把变量提升搞懂的我(因为这两天一直在研究变量提升,自我感觉已经很良好了,哈哈哈),拿到了一道打脸的题。当然了,拿给身边的程序员朋友们,做对的也......废话不多说,一起来看下这道题吧。

1. 题目

var a = 0;
if (true) {a = 1;function a() {};a = 21;console.log(a)
}
console.log(a);

答案:21 1

9dbb6baed883bcf028b74da81dfd3066.gif

2. 重新学习变量提升

2.1 var

首先说使用var声明的变量,只要那个变量是使用var声明的,那么在变量提升阶段要做的事情只有一个,就是去声明这个变量。

一道简单的题目看懂var的变量提升

console.log(a);
var a = 1;
console.log(a);
  • 在代码执行之前先创建一个变量a;此时并不会进行赋值等操作
  • 代码执行
    • console.log(a);因为此时已经有a这个变量了,只不过没有赋值,因此输出undefined
    • var a = 1;给变量a进行赋值为1
    • console.log(a);这时候再输出a的值,就是上面的赋值结果1

控制台查看输出结果

abafc1f7eb9e09feb09c9ff8b1c40ed5.png

2.2 let const

我们知道使用let和const声明的变量没有变量提升,只有当代码走到那一行才会去执行声明等操作;

2.3 function

function fn(){...}没有在if/for等任何大括号内的时候,它会声明+定义,即:

  • 把右边的值存储在堆内存中,并把堆内存地址存储在栈内存;
  • 然后声明变量fn,
  • 最后让fn和堆地址关联

但如果把上面的这句话放在if/for这样的大括号内的时候,就变成下面这样的过程了:

  • 声明一个变量fn存储在栈内存中
  • 当满足条件进入到大括号内的时候
    • 第一件事情就是定义这个函数:即让这个变量名和堆地址进行关联。注意此时这个变量fn已经变为这个块内私有的变量了,和外面的fn没有任何关系;
    • 当代码执行过程中,遇到function fn(){...}的时候,它会去把全局中的fn修改一下,修改为堆中fn的值。修改完之后,后面对fn的操作又和全局的fn没任何关系

3.看穿题目的'庐山真面目'

这道题就是利用上面的所说到function的变量提升情况。即当在if/for中存在函数,并且条件成立,那么这个函数就变为私有,直到遇到function fn(){...}的时候才会去操作全局的fn,其它情况操作的fn都是私有的。

下面是这道题的图解过程

80775bf9f2cd7343602d42b464b5fc9d.png

e471e1af38d4acc9eec7613eb778e562.png

4. 同类型题目的练习

{function foo(){}foo=1;
}
console.log(foo);{function foo(){}foo=1;function foo(){}
}
console.log(foo);{function foo(){}foo=1;function foo(){}foo=2;
}
console.log(foo);

2cca8edd16bf764ef2fa3abfc4cce68d.png

5. 总结

这也是浏览器为了解决新老版本改善的function的变量提升机制,可以看出也是在一步步的完善,因此我们也要不断的学习,才可以跟上互联网的快速发展。

a29cb846f8db06a4c7ab103af0d492a4.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift之 vm10虚拟机安装Mac OS X10.10教程

VM10装Mac OS X 10.9.3及更新到Mac OS X 10.10,让你的windows也能玩Swift 。 近期WWDC放出终极大招——新的编程语言Swift(雨燕),导致一大波程序猿的围观和跃跃欲试。当然了,工欲善其事,必先利其器,所以对于那些没有Mac又想要尝鲜的小伙伴肯定非常为难。可是,请放…

c++ 实现录音并且指定到文件_通话自动录音,留下美好回忆,记录完整录音证据...

手机通话,如果自动录音多好,许多人与我一样抱有这个想法。记得华为Android版本5.0时代,手机没有自动录音功能,我一直到网上下载自动通话录音软件,有时甚至是下载ROOT版的带自动通话功能的EMUI版本进行刷机安装。那个时…

2639-Bone Collector II (01背包之第k优解)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid2639 求第k优解的关键代码: 用两个数组记录两种状态(选择或不选择),并且只要记录前k次。在这两个数组中都是前k次可能的最优解。所以我们只要把这两个数组做比较…

opencv在同一窗口打印多张图片

首先,由于cv2处理的图片是通过ndarray的格式操作的,也就是说通过array的拼接就可以实现图片的拼接,那么之后就可以通过简单的imshow将合并的图片打印从而达到在一个窗口中显示多张图片的目的。 import cv2 import numpy as npimg1 cv2.imrea…

dj打碟怎么学_学DJ打碟 - Rane声卡连接

上一篇内容中,老师讲过在学DJ打碟的时候,是离不开对软件方面的操作,其实每一个学习过程,当你学会之后,在“回头看”的时候,都会觉得:原来学DJ打碟这么简单啊,这就是已经学习过的人会…

微信企业号第三方应用开发[一]——创建套件

注:文中绿色部分为摘自微信官方文档 第三方应用提供给企业的是一个应用,但是应用必须在套件下创建,所以第一步是要创建套件。 注册成为应用提供商,必须输入以下信息: 信息项要求及说明企业Logo应用提供商的企业Logo&am…

html原生上传,一个基于HTML5及原生JS的文件上传组件--JohnUploader

运行效果图一、组件介绍基本特点基于HTML5的FileReader和FormData可以完成多文件选择,并预览完成文件的异步上传原生XHR对象,适配多浏览器代码class JohnUploader{url;fileField;vollay;/**** param url 文件上传的地址* param fileField 一个"文件…

微信企业号第三方应用开发[二]——创建应用

在应用套件里添加应用 当你创建完应用套件后,需要在套件配置应用,应用的信息填写如下。 基本信息: 信息项要求及说明应用Logo应用的Logo,小于2M,640*640,在授权页会被用于展示。应用名称应用的名称&#xf…

jQ效果:简单的手风琴效果

实现效果如图所示&#xff1a; html结构&#xff1a; <div class"item_box box10"><div class"item_box_wp"><div class"voice_2"><ul><li class"li1" id"li1"><div class"fold"…

golang 日志分析_容器日志采集利器:Filebeat深度剖析与实践

在云原生时代和容器化浪潮中&#xff0c;容器的日志采集是一个看起来不起眼却又无法忽视的重要议题。对于容器日志采集我们常用的工具有filebeat和fluentd&#xff0c;两者对比各有优劣&#xff0c;相比基于ruby的fluentd&#xff0c;考虑到可定制性&#xff0c;我们一般默认选…

java ldap userpassword 解密_Spring Boot中使用LDAP来统一管理用户信息

LDAP简介LDAP(轻量级目录访问协议&#xff0c;Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务。目录服务是一种特殊的数据库系统&#xff0c;其专门针对读取&#xff0c;浏览和搜索操作进行了特定的优化。目录一般用来包含描述性的&#xff0c;基于…

unity中怎么做河流_【干货】工作中怎么做工业设计的?(一)

最近在找工作&#xff0c;一直在看招聘信息。看到工业设计工资还是蛮高的。应届毕业生一般是4-6K&#xff0c;1-3年工作经验是6-8K&#xff0c;3年以后的差不多是8K以上了。我没有嫉妒羡慕恨&#xff0c;发誓&#xff0c;真的没有。工业设计已经被重视&#xff0c;未来的道路会…

[易学易懂系列|golang语言|零基础|快速入门|(一)]

golang编程语言&#xff0c;是google推出的一门语言。 主要应用在系统编程和高性能服务器编程&#xff0c;有广大的市场前景&#xff0c;目前整个生态也越来越强大&#xff0c;未来可能在企业应用和人工智能等领域占有越来越重要的地位。 本文章是【易学易懂系列|编程语言入门】…

spi收发时的寄存器sr不变_「正点原子Linux连载」第二十七章SPI实验(二)

1)实验平台&#xff1a;正点原子Linux开发板2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号&#xff0c;获取更多资料&#xff1a;正点原子文件bsp_spi.c中有两个函数&#xff1a;spi_init和spich0_readwrite_byte&#xff0c;函数spi_init是SPI初始化函…

[JSOI2018]潜入行动

题解 一道思路不难但是写起来很麻烦的树形背包 我们发现每个节点有很多信息需要保留 所以就暴力的设\(f[u][j][0/1][0/1]\)表示点u的子树分配了j个监察器,点u有没有被控制,点u放没放监察器 然后就分四种情况暴力讨论就好了 注意背包的时候要卡常数 代码 #include<cstdio>…

css。元素样式、边框样式

1.外边距  margin 缩写形式&#xff1a; margin&#xff1a;上边距  右边距  下边距  左边距 margin&#xff1a;上下边距  左右边距 margin&#xff1a;上边距  左右边距  下边距 2.内边距  padding 缩写形式&#xff1a; padding&#xff1a;上边距  右边距…

C# 动态创建数据库三(MySQL)

前面有说明使用EF动态新建数据库与表&#xff0c;数据库使用的是SQL SERVER2008的&#xff0c;在使用MYSQL的时候还是有所不同 一、添加 EntityFramework.dll &#xff0c;System.Data.Entity.dll &#xff0c;MySql.Data, MySql.Data.Entity.EF6 注意&#xff1a;Entity Frame…

如何用计算机管理员权限,教你电脑使用代码添加管理员权限的详细教程

我们在使用电脑运行某些软件的时候&#xff0c;可能需要用到管理员权限才能运行&#xff0c;通常来说直接点击右键就会有管理员权限&#xff0c;但最近有用户向小编反馈&#xff0c;在需要管理员权限的软件上点击右键没有看到管理员取得所有权&#xff0c;那么究竟该如何才能获…

activiti 5.22的demo运行

activiti 5.22的demo运行 从github上clon下来的activiti项目,运行demo项目activiti-webapp-explorer2时&#xff0c;在使用到流程设计工作区&#xff0c;选取activiti modeler作为设计器的时候报错。 从下面的报错信息中发现&#xff0c;请求路径http://localhost:8080/activit…

内是不是半包围结构_轻钢别墅的体系结构

一、轻钢别墅介绍1、轻钢别墅的屋面系统轻钢别墅屋面系统是由屋架、结构OSB面板、防水层、轻型屋面瓦&#xff08;金属或沥青瓦&#xff09;组成的。轻钢结构的屋面&#xff0c;外观可以有多种组合。材料也有多种。在保障了防水这一技术的前提下&#xff0c;外观有了许多的选择…