ES6 简单练习笔记--变量申明

一、ES5 变量定义

        1.在全局作用域中 this 其实就是window对象

<script>console.log(window === this)
</script>输出结果: true

        2.在全局作用域中用var定义一个变量其实就相当于在window上定义了一个属性

        例如: var name = "孙悟空" 其实就相当于执行了 window.name = "孙悟空" 或者this.name = "孙悟空"

// 用var 定义一个变量其实就是在window上添加一个属性
var name = "孙悟空"
console.log(name)
console.log(window.name)
console.log(this.name)执行结果:
孙悟空
孙悟空
孙悟空

        3.变量提升 使用var声明变量,会自动提升到函数作用域顶部
        可以分为两种情况,在全局作用域和在代码块或者方法中

<script>// name 变量是在下面定义的,但是可以在上面使用 name 这个变量// 这是因为变量被提升到作用域的最上面console.log(name)console.log(window.name)console.log(this.name)var name = "孙悟空"</script>运行结果:
空白
空白
空白可以看到这里直接相当于在最上面定义了 var name 但是没有初始化,我感觉因该是输出undefined
但是这里啥也没输出,但是没有报错
这里测试的时候千万不要刷新页面,刷新就相当于前一次把name放入window对象中
function printName(){console.log(name)
}printName()
var name = "孙悟空"运行结果:
空白同样是因为在全局作用域使用var定义变量,就相当于在最上面定义了一个变量,其实就是在编译的时候,直接把这个变量放在window身上了,但是没有初始化,调用printName()的时候,还未执行初始化语句,所以输出空白
<script>// 在代码块中{console.log(address)var address = "花果山"console.log(address)}// 在方法中function defineSex(){console.log(sex)var sex = "男"console.log(sex)}defineSex()</script>运行结果:undefined
花果山
=====================================
undefined
男这里没有报错只是输出了undefined,说明在执行的时候是存在这个变量的,只是没有进行初始化
以上代码相当于下面的代码<script>// 在代码块中{var address;console.log(address)address = "花果山"console.log(address)}// 在方法中function defineAge(){var sex;console.log(sex)sex = "男"console.log(sex)}defineAge()</script>

        4.在方法中用 var 定义的变量只在方法中有效,在方法外面是访问不到的,因为当方法执行完的时候,在其中用var定义的变量就销毁了

<script>function defineSex(){var sex = "男"console.log(sex)}defineSex()console.log(sex)</script>运行结果:
男Uncaught ReferenceError: sex is not defined

        5.在代码块中用 var 定义的变量在代码快中有效,在代码块外面也能访问到

<script>console.log(address)if(true){var address = "花果山"console.log(address)}console.log(address)</script>运行结果:
undefined
花果山
花果山<script>console.log(address)while(true){var address = "花果山"console.log(address)break;}console.log(address)</script>运行结果:
undefined
花果山
花果山

        6.不使用 var, 直接进行变量定义

<script>// 虽然这里能够访问到 name 但是输出是空白,说明也是做了变量提升,将name放在最前面// 但是由于没有初始化,所以不能输出孙悟空,这里有点好奇为啥不输出undefined// 这种情况下大家测试的时候千万要重新开一个浏览器窗口,第二次刷新的时候就不准确了,// 可以输出 孙悟空 ,因为第一次打开的时候,就将name放入 window 了,刷新就相当于// window 中已经有 name 这个属性了console.log(name)// 在全局作用域不使用var直接定义的变量相当于全局变量,在上面也能访问到name = "孙悟空"function defineGlobal(){// 在方法中不使用var直接定义的变量相当于全局变量,但是必须得是在这个方法被调用过之后// 才可以在方法外面访问到这个全局变量global = "我是全局变量"}defineGlobal()console.log(global)function defineGlobal1(){global1 = "我是全局变量1"}// defineGlobal1 没有被调用所以在defineGlobal1 中定义的全局变量global1在方法// 外面是访问不到的console.log(global1)</script>运行结果:空白没有报错我是全局变量Uncaught ReferenceError: global1 is not defined

        7.在网上看到一个面试题挺有意思

<script>// 变量提升将下面定义的 a 和 b 提到最上面,但是不初始化,所以这里a b 都是undefinedconsole.log("1", a, b);  //1 undefined undefined// 这里对 a b 进行初始化var a = 12, b="34";function foo(){// 这里换了一个作用域,也就是在方法体内部// 由于在这个作用域中又定义了一个 a 变量,所以 a 会被提到当前作用域(方法内)的最上面// 但不会初始化,所以这里的 a 其实是方法中新定义的 a ,所以是undefined,// 方法中没有重新定义 b,所以还用方法外面定义且初始化好的 bconsole.log("2", a, b); //2 undefined 34// 这里重新对方法中定义的 a 进行初始化var a=b=12;// 上面对方法中定义的 a 初始化,所以这里输出 方法中定义的 a 和 外面定义的 b 都是12console.log("3", a, b);  //3 12 12}foo()//这里输出的是 外面定义的 a ,外面定义的 b ,由于b在方法中被修改为12console.log("4", a, b); //4 12 12</script>运行结果:
1 undefined undefined
2 undefined 34
3 12 12
4 12 12
<script>// 变量提升将下面定义的 a 和 b 提到最上面,但是不初始化,所以这里a b 都是undefinedconsole.log("1", a, b);  //1 undefined undefined// 这里对 a b 进行初始化var a = 12, b="34";function foo(){// 这里换了一个作用域,也就是在方法体内部// 由于在这个作用域中又定义了一个 a 变量,一个b变量,所以 重新定义的 a b 会被// 提到当前作用域(方法内)的最上面// 但不会初始化,所以这里的 a 和 b 其实是方法中新定义的 a b ,所以都是undefined,console.log("2", a, b); //2 undefined undefined // 这里重新对方法中定义的 a 进行初始化var a=12 , b=12;// 上面对方法中定义的 a 初始化,所以这里输出 方法中定义的 a 和 外面定义的 b 都是12console.log("3", a, b);  //3 12 12}foo()// 这里输出的是外面定义的 a ,外面定义的 b ,这次方法中重新定义了一个b,所以外面的b没有被// 修改console.log("4", a, b); //4 12 34</script>运行结果:
1 undefined undefined
2 undefined undefined
3 12 12
4 12 34

        8.可以在同一作用域中重复多次用 var 定义相同名称的变量

<script>var name = "孙悟空"var name = "猪八戒"console.log(name)</script>运行结果:
猪八戒没有报错

二、ES6 let 申明变量

        1.块级作用域

<script>console.log(address)if(true){let address = "花果山"console.log(address)}console.log(address)</script>Uncaught ReferenceError: address is not defined

        2.在同一作用域中不能重复定义

<script>let name = "孙悟空"let name = "猪八戒"
//Uncaught SyntaxError: Identifier 'name' has already been declared 了解此错误
</script><script>function printName(){let name = "孙悟空"let name = "猪八戒"}
//Uncaught SyntaxError: Identifier 'name' has already been declared了解此错误
</script><script>let name = "孙悟空"//function printName(){let name = "猪八戒"console.log(name)}printName()console.log(name)
</script>没有报错,运行结果:
猪八戒
孙悟空说明在不同的作用域可以定义相同名称的变量<script>let name = 1;if(true){let name = 2;console.log(name)}console.log(name)</script>
运行结果:
2
1
<script>let address = "花果山"var address = "猪八戒"
</script>Uncaught SyntaxError: Identifier 'address' has already been declared
<script>var address = "猪八戒"let address = "花果山"
</script>
Uncaught SyntaxError: Identifier 'address' has already been declared

        3.不存在变量提升

<script>console.log(address)let address = "猪八戒"</script>Uncaught ReferenceError: Cannot access 'address' before initialization这里跟 var 有很大不同, var会进行变量提升,不会报错的 

        4.let 在全局作用域定义的变量是不会挂到window身上的

<script>let address = "猪八戒"console.log(window.address)var name = "孙悟空"console.log(window.name)</script>运行结果:
undefined
孙悟空说明 var 在全局作用域定义的变量会挂到window身上, 但是let在全局作用域定义的变量不会挂到window身上

三、ES6 const 申明变量

        1.声明变量时必须同时初始化

    <script>const name;</script>Uncaught SyntaxError: Missing initializer in const declaration

        2.一旦申明完了不能修改

<script>const name = "孙悟空";name = "猪八戒";
</script>Uncaught TypeError: Assignment to constant variable.

  其实这里的不能修改指的是不能修改 const 变量指向的内存地址,但是修改内存地址里面的数据是可以的。

<script>const TEAM = ["唐僧" ,"孙悟空" , "猪八戒"];TEAM.push("沙僧")TEAM.push("白龙马")console.log(TEAM)</script>

<script>const TEAM = ["唐僧" ,"孙悟空" , "猪八戒"];TEAM = ["唐僧" ,"孙悟空" , "猪八戒"];
</script>Uncaught TypeError: Assignment to constant variable.
<script>const person = {name:"孙悟空",address:"花果山"}person.weapon = "金箍棒"console.log(person)</script>

<script>const person = {name:"孙悟空",address:"花果山"}person = {name:"孙悟空",address:"花果山"}
</script>Uncaught TypeError: Assignment to constant variable
varletconst
函数级作用域块级作用域块级作用域
重复声明不可重复声明不可重复声明
变量提升不存在变量提升不存在变量提升
值可更改值可更改值不可更改
全局变量挂载到window全局变量不会挂载到window全局变量不会挂载到window
for (var i = 1; i <= 5; i++) {setTimeout(function () {console.log(i);}, 0);}console.log(window.i)  // 6 var定义的变量会挂到 window 上运行结果:
6
6
6
6
6
6在每次循环迭代中,都会调用 setTimeout 函数,传入一个匿名函数(回调函数)和一个延迟时间
(这里是 0 毫秒)。尽管延迟时间设置为 0,这并不意味着回调函数会立即执行。相反,
它会被添加到 JavaScript 的事件队列中,等待当前执行栈清空后执行// 如果要用var定义变量的话需要通过闭包的方式来解决
for (var i = 1; i <= 5; i++) {(function(j) {setTimeout(function () {console.log(j);}, 0);})(i);
}
for (let i = 1; i <= 5; i++) {setTimeout(function () {console.log(i);}, 0);}console.log(window.i)  // undefined let定义的变量不会挂到window运行结果:
undefined
1
2
3
4
5

下面这个例子要求当点击某个div的时候,将其背景颜色改成粉色

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><style>div{border-style: inset;border-color: black;border-width: 1px;height: 100px;width: 100px;float: left;margin-left: 20px;background-color: white;}</style></head><body><div></div><div></div><div></div>
</body><script>var boxes = document.getElementsByTagName("div")console.log(boxes)console.log(boxes[0])// 这里使用 let 定义 变量 i ,进行遍历没问题for (let i = 0; i < boxes.length ; i++) {boxes[i].onclick = function (){boxes[i].style.background = 'pink'}}</script></html>

<script>var boxes = document.getElementsByTagName("div")console.log(boxes)console.log(boxes[0])// 这里使用 var 定义 变量 i ,进行遍历就会报错for (var i = 0; i < boxes.length ; i++) {boxes[i].onclick = function (){boxes[i].style.background = 'pink'}}</script>Uncaught TypeError: Cannot read properties of undefined (reading 'style')这里主要原因是 var i 定义了一个全局变量,这个变量会挂到 window 上,当for循环执行完的时候,i === 3
,也就是我们点击的时候 i === 3,boxes只有3个元素,当我们点击的时候就会回调 
boxes[i].style.background = 'pink' ,boxes[3]是undefined,所以会报错

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

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

相关文章

Arduino大师练成手册 -- 控制 PN532 NFC 模块

要在 Arduino 上控制 PN532 NFC 模块&#xff0c;你可以按照以下步骤进行&#xff1a; 硬件连接 VCC&#xff1a;连接到 Arduino 的 3.3V 引脚。 GND&#xff1a;连接到 Arduino 的 GND 引脚。 SDA&#xff1a;连接到 Arduino 的 SDA 引脚&#xff08;通常是 A4&#xff09…

python——Django 框架

Django 框架 1、简介 Django 是用python语言写的开源web开发框架&#xff0c;并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能…

大模型正确调用方式

1、ollama 安装 curl -fsSL https://ollama.com/install.sh | sh 如果是AutoDl服务器&#xff0c;可以开启学术加速。 source /etc/network_turbo 本次使用腾讯云Cloud Studio&#xff0c;所以已经安装好了 Ollama 2、启动 ollama run 模型的名字 ollama serve # 开启服务 olla…

CE-PBFT:大规模联盟区块链的高可用一致性算法

摘要 区块链已广泛应用于农产品溯源、供应链管理、物流运输等各个领域。作为联盟区块链不可缺少的组成部分&#xff0c;共识算法保证了网络中每个节点的一致性和可信度。然而&#xff0c;由于通信过程的复杂性&#xff0c;现有的大规模联盟区块链场景中的共识算法存在低系统吞…

2025年新开局!谁在引领汽车AI风潮?

汽车AI革命已来。 在2025年伊始开幕的CES展上&#xff0c;AI汽车、AI座舱无疑成为了今年汽车行业的最大热点。其中不少车企在2025年CES上展示了其新一代AI座舱&#xff0c;为下一代智能汽车的人机交互、场景创新率先打样。 其中&#xff0c;东软集团也携带AI驱动、大数据支撑…

通义灵码插件保姆级教学-IDEA(安装及使用)

一、JetBrains IDEA 中安装指南 官方下载指南&#xff1a;通义灵码安装教程-阿里云 步骤 1&#xff1a;准备工作 操作系统&#xff1a;Windows 7 及以上、macOS、Linux&#xff1b; 下载并安装兼容的 JetBrains IDEs 2020.3 及以上版本&#xff0c;通义灵码与以下 IDE 兼容&…

文献阅读 250125-Accurate predictions on small data with a tabular foundation model

Accurate predictions on small data with a tabular foundation model Accurate predictions on small data with a tabular foundation model | Nature 使用一种基于表格的模型来对小型数据实现准确预测 ## Abstract: 基于其他列来填充标签列中缺失值的基本预测任务对于各种应…

dup2 + fgets + printf 实现文件拷贝

思路 将源文件的内容读取到内存中&#xff0c;然后将这些内容写入到目标文件。 1: 打开源文件、目标文件 fopen() 以读模式打开源文件。 open ()以写模式打开目标文件。 2: 读取源文件、写入目标文件 fgets ()从源文件中读取内容。 printf ()将内容写入目标文件。 printf…

C++——list的了解和使用

目录 引言 forward_list与list 标准库中的list 一、list的常用接口 1.list的迭代器 2.list的初始化 3.list的容量操作 4.list的访问操作 5.list的修改操作 6.list的其他操作 二、list与vector的对比 结束语 引言 本篇博客要介绍的是STL中的list。 求点赞收藏评论…

Charles 4.6.7 浏览器网络调试指南:HTTPS抓包(三)

概述 在现代互联网应用中&#xff0c;网络请求和响应是服务交互的核心。对于开发者和测试人员来说&#xff0c;能够准确捕获并分析这些请求&#xff0c;是保证系统稳定性和性能的关键。Charles作为一个强大的网络调试工具&#xff0c;不仅可以捕获普通的HTTP请求&#xff0c;还…

js手撕 | 使用css画一个三角形 使用js修改元素样式 驼峰格式与“-”格式相互转化

1.使用css画一个三角形 借助 border 实现&#xff0c;在 width 和 height 都为 0 时&#xff0c;设置 border&#xff0c;便会呈现三角形。想要哪个方向的三角形&#xff0c;设置其他三边为 透明即可。同时&#xff0c;可以通过调整不同边的宽度&#xff0c;来调整三角形的高度…

六、深入了解DI

依赖注入是⼀个过程&#xff0c;是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源&#xff0c;⽽资源指的就是对象. 在上⾯程序案例中&#xff0c;我们使⽤了 Autowired 这个注解&#xff0c;完成了依赖注⼊的操作. 简单来说,就是把对象取出来放到某个类的属性中。 关于依赖注…

Doris Schema Change 常见问题分析

1. 什么是 Schema Change Schema Change 是在数据库中修改表结构的一种操作&#xff0c;例如添加列、删除列、更改列类型等。 ⚠️Schema Change 限制⚠️ 一张表在同一时间只能有一个 Schema Change 作业在运行。分区列和分桶列不能修改。如果聚合表中有 REPLACE 方式聚合的…

Qt Designer and Python: Build Your GUI

1.install pyside6 2.pyside6-designer.exe 发送到桌面快捷方式 在Python安装的所在 Scripts 文件夹下找到此文件。如C:\Program Files\Python312\Scripts 3. 打开pyside6-designer 设计UI 4.保存为simple.ui 文件&#xff0c;再转成py文件 用代码执行 pyside6-uic.exe simpl…

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理

Centos7系统php8编译安装ImageMagick/Imagick扩展教程整理 安装php8安装ImageMagick1、下载ImageMagick2、解压并安装3、查看是否安装成功 安装imagick扩展包 安装php8 点我安装php8 安装ImageMagick 1、下载ImageMagick wget https://www.imagemagick.org/download/ImageMa…

数据中台解决方案

数据中台概述 数据中台是数字化转型的基础&#xff0c;它不仅仅是一个平台&#xff0c;而是一套可持续让企业数据用起来的机制。这套机制涵盖了数据的采集、治理、开发到数据服务的全过程&#xff0c;旨在通过数据复用能力的提升&#xff0c;灵活支撑前端业务。数据中台通过“…

Linux——rzsz工具

rzsz这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件. 安装完毕之后可以通过拖拽的方式将文件上传过去. 安装rzsz工具 rz&#xff1a;从Windows机器上传到远程Linux机器&#xff08;或者直接把文件托进Xshell中&#xff09; sz&#xff1a;将文件从Linux远…

SpringBoot基础概念介绍-数据源与数据库连接池

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池&#xff0c;同时介绍SpringBoot整合两种连接池的教程 文章目录 1 数据库与数据库管理系统2 JDBC与数…

MyBatis框架基础学习及入门案例(2)

目录 一、数据库建表(tb_user)以及添加数据。 &#xff08;1&#xff09;数据库与数据表说明。 &#xff08;2&#xff09;字段与数据说明。 二、创建模块(或工程)、导入对应所需依赖坐标。 三、编写MyBatis核心主配置文件。(解决JDBC中"硬编码"问题) &#xff08;1&…

js小游戏---2048(附源代码)

一、游戏页面展示 开始游戏&#xff1a; 游戏结束&#xff1a; 二、游戏如何操作 通过监听键盘的操作&#xff0c;进行移动变化 键盘上下左右键控制页面中所有模块同时向键入的方向移动&#xff0c;如果有两块一样的方块&#xff0c;就进行合并&#xff0c;并且在键盘每操作…