javascript中创建变量的方式 与 var和let有什么区别

一、创建变量的7种方式:


        1、var
        2、function 创建变量(函数名是一个变量
        3、let
        4、const 创建常量
        5、import 基于es6 的模块规范导出需要的信息
        6、class 基于 es6 创建的类
        7、Symbol 创建唯一值

二、var与let有什么区别

       1、let不允许在相同的作用域下重复声明,而var允许;

        2、let会产生块级作用域,var不会。

        3、var有变量提升,而let没有;

        4、let没有暂时性死区问题;

        5、let创建的全局变量没有给window设置对应的属性;

变量提升机制

当浏览器开辟出供代码执行的栈内存后,代码并没有自上而下立即执行,而是继续做了一些事情:把当前作用域中所有带var/function关键字的进行提前的声明和定义

当执行 JS 代码时,会生成执行环境, 只要代码不是写在函数中的,就是在
全局执行环境中 , 函数中的代码会产生 函数执行环境 , 只此两种执行环境。
b() // call b
console.log(a) // undefined
var a = 'Hello world'
function b() {console.log( 'call b')
}

以上输出是因为函数和变量提升的原因 。通常提升的解释是说将声明的代码移动到了顶部, 这其实没有什么错误,便于大 家理解 。但是更准确的解释应该是:在生成执行环境时,会有两个阶段 。第⼀个阶段是创建的阶段JS 解释器会找出需要提升的变量和函数, 并且给他们 提前在内存中开辟好空间, 函数的话会将整个函数存⼊内存中变量只声明并且赋值为 undefined ,所以在第⼆个阶段,也就是代码执行阶段, 我们可以 直接提前使用。

在提升的过程中,相同的函数会覆盖上⼀个函数, 并且函数优先于变量提升
b( ) // call b second
function b() {console.log( 'call b fist')
}
function b() {console.log( 'call b second')
}
var b = 'Hello world'

var 会产生很多错误,所以在 ES6中引⼊了 let let 不能在声明前使用,但是这并不是常说的 let 不会提升, let 提升了,在第⼀阶段内存也已经为他开辟好了空间(但是只声明并未赋值初始化),但是因为这个声明的特性导致了并不能在声明前使用。

关于变量提升的演示题

示例1:下面代码能否实现点击某个按钮,body的背景色改为按钮对应的颜色,若不能,如何改进

<body>
<button class="red">红</button>
<button class="green">绿</button>
<button class="blue">蓝</button>
</body>
<script>var body = document.querySelector('body')var buttons = document.querySelector('button')var arr = ['red','green','blue']for(var i = 0; i<buttons.length;i++){buttons[i].onclick = function (){body.style.background = arr[i]}}
</script>

答案当然是不能,因为通过var定义的变量,在for循环中的i是全局的,变量提升、3次循环过后,i=3,因为点击每个都相当于点击最后一个,要实现就需要将var变成let。

示例2:

var a = 1;
function test() {console.log(a);if(false) {var a = 2;}
}
test();

Javascript分为预处理阶段和执行阶段,尽管if里面的语句不会被执行,但是在预处理阶段还是会将其提升,因此最终还是undefined。
函数会先去找自己内部的变量,内部有就不会往外面找,内部没有才去外面找

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

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

相关文章

Linux进阶篇:centos7扩展root分区:LVM应用案例

centos7扩展root分区&#xff1a;LVM应用案例 当服务器根分区或者是root分区存储空间快用完的时候&#xff0c;并且重要的数据都在root分区下&#xff0c;当如何应对&#xff0c;没关系坐好&#xff0c;分分钟解决它&#xff0c;我们可以进行分区扩容。 一 添加一块新的硬盘 …

谈谈系列之移动时代,我的产品技术观

其实一直想着写这篇文章&#xff0c;但是缺乏灵感&#xff0c;下笔犯难。信息时代发展速度快到令人目不暇接&#xff0c;从最开始的个人PC&#xff0c;到拨号上网&#xff0c;再到光纤入户&#xff0c;再到现在4G/5G移动互联网&#xff0c;一晃也不过短短三四十年。程序主流语言…

java 读取zip文件的两种方式

以下是使用Java读取zip文件的两种实现方法&#xff1a; 方法1&#xff1a;使用java.util.zip.ZipInputStream类 import java.io.FileInputStream; import java.io.InputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream;public class ZipReader …

某中小型网游公司绩效管理诊断项目成功案例纪实

【客户行业】 网游行业 【问题类型】 绩效管理 【客户背景】 某中小型网游科技发展有限公司成立于2006年,是一家专业的网页游戏研发、互联网应用、手机游戏开发于一体的高新技术科技企业,位于北京市昌平区。公司自成立以来,一直稳步发展,到目前为止,员工人数约150人。近…

鸿蒙应用开发之图案密码锁组件

前面学习了导航组件,现在来学习另一个密码设置和验证组件,这种组件比较常用。因为当用触屏手机之后,屏幕上就可以滑动操作,比普通PC电脑要多一些功能了。早前的密码都是输入数字,没有滑动输入九宫格的密码。 大体如下面的界面: 采用这种密码,一般情况下是不用记住数字,…

pytest详解(一)

目录 前言安装检验 编写测试文件一个简单完整的pytest的组成结构 pytest运行用例时携带的参数&#xff08;常用&#xff09;pytest的用例命名规则pytest的常用运行方式pytest指定运行用例指定运行一个文件夹中的用例指定运行一个文件夹中的一个文件中的用例指定运行一个文件夹中…

汇编——SSE打包整数

SSE也可以进行整数向量的加法&#xff0c;示例如下&#xff1a; ;sse_integer.asm extern printfsection .datadummy db 13 align 16pdivector1 dd 1dd 2dd 3dd 4pdivector2 dd 5dd 6dd 7dd 8fmt1 db "Packed Integer Vector 1: %d, %d, %d, %d",…

【鹅厂摸鱼日记(二)】(生活篇)初到深圳的人情冷暖

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:重生之我在鹅厂摸鱼⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多知识   &#x1f51d;&#x1f51d; 摸鱼日记 1. 前言2. 鹅厂的人文关怀…

论文笔记:NEFTune: Noisy Embeddings Improve Instruction Finetuning

iclr 2024 reviewer 评分 5666 1 论文思路 论文的原理很简单&#xff1a;在finetune过程的词向量中引入一些均匀分布的噪声即可明显地提升模型的表现 2 方法评估

JavaScript数组操作方法全录

改变原数组的方法&#xff1a; push() - 将一个或多个元素添加到数组的末尾&#xff0c;并返回新数组的长度。 pop() - 从数组中移除最后一个元素&#xff0c;并返回该元素。 shift() - 从数组中移除第一个元素&#xff0c;并返回该元素。 unshift() - 将一个或多个元素添加到…

2024年第二届交通运输与建筑工程国际会议(IACTCE2024)

2024年第二届交通运输与建筑工程国际会议&#xff08;IACTCE2024&#xff09; 会议简介 本次会议旨在为从事交通建设工程等相关领域的专家学者、工程技术人员和研发人员提供一个平台&#xff0c;分享科研成果和前沿技术&#xff0c;了解学术发展趋势&#xff0c;拓宽研究思路…

docker 安装canal

一、新建文件夹 新建文件夹logs, 新建文件canal.properties instance.properties docker.compose.yml canal.propertie 修改如下&#xff1a; 修改instance.properties内容如下 1.1 canal.properties ################################################# ######### …

算法刷题应用知识补充---数论

这里写目录标题 快速幂求a^k%p题结 快速幂求逆元题结 扩展欧几里得求逆元题结 排列组合题结二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 快速幂求a^k%p 题 结 主要用到a的k次方&#xff0c;可以用多个a的…

fastadmin + laragon + nginx的后台访问路径配置

使用过fastadmin的小朋友都知道&#xff0c; fastadmin 默认的是不能访问admin模块的&#xff0c; 它在public 文件夹中又新建了一个 XXX.php 来指向 admin 模块的&#xff0c;作用像 index.php 的文件 以前我每次使用的时候&#xff0c;直接就到 config配置文件中把 admin 模块…

磁盘管理与逻辑卷

磁盘管理 会在linux中使用硬盘 分区 格式化&#xff08;重新安装文件系统&#xff09; 挂载 磁盘的硬件架构 扇区&#xff1a;一个扇区512字节&#xff0c;是磁盘的最小单位 磁道&#xff1a;同一盘片不同半径的同心圆 柱面&#xff1a;不同盘片相同半径构成的圆&#xf…

String类(1)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&a…

CC工具箱使用指南:【融合同类碎图斑】

一、简介 在一些经过不合理处理的数据中&#xff0c;经常会存在碎图斑&#xff0c;正常情况下用【融合】或【消除】工具即可解决。 但是【融合】工具会融掉无关的字段&#xff0c;【消除】工具则会将碎图斑融给不同用地类型的图斑。 如下图所示&#xff0c;因为B1面积更大&a…

Go-学会方法的基本使用

本节重点&#xff1a; 学会方法的基本使用 方法主要源于 OOP 语言&#xff0c;在传统面向对象语言中 (例如 C), 我们会用一个“类”来封装属于自己的数据和函数&#xff0c;这些类的函数就叫做方法。 虽然 Go 不是经典意义上的面向对象语言&#xff0c;但是我们可以在一些接收…

蓝桥杯嵌入式(G431)备赛笔记——PWM+LCD+按键

目录 题目要求&#xff08;真题&#xff09;&#xff1a; cubeMX配置&#xff1a; 小试牛刀&#xff1a; Keil代码&#xff1a; 效果演示&#xff1a; 题目要求&#xff08;真题&#xff09;&#xff1a; 使用第十一届第二场真题&#xff0c;练习PWM波部分的代码&#xff0c…

德国FSL18罗德与施瓦茨频谱分析仪

181/2461/8938产品概述&#xff1a; 频率范围:9 kHz至18 GHz&#xff08;超范围至20 GHz&#xff09;频率分辨率:1赫兹28 MHz的信号分析带宽低测量不确定性&#xff0c;即使在微波范围内通用测量应用&#xff0c;例如光谱图轻巧紧凑&#xff0c;便于现场安装、维护和服务 9 kH…