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

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,所以会报错

相关文章:

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

一、ES5 变量定义 1.在全局作用域中 this 其实就是window对象 <script>console.log(window this) </script>输出结果: true 2.在全局作用域中用var定义一个变量其实就相当于在window上定义了一个属性 例如: var name "孙悟空" 其实就相当于执行了 win…...

2025.1.21——六、BUU XSS COURSE 1

题目来源&#xff1a;buuctf BUU XSS COURSE 1 一、打开靶机&#xff0c;整理信息 有吐槽和登陆两个尝试点&#xff0c;题目名称提示是XSS漏洞 XSS&#xff08;Cross-Site Scripting&#xff09;漏洞 1.定义&#xff1a;跨站脚本攻击&#xff0c;是一种常见的 Web 安全漏洞。攻…...

Linux - 五种常见I/O模型

I/O操作 (输入/输出操作, Input/Output) 是指计算机与外部设备就行数据交互的过程. 什么是外部设备: 如键盘, 鼠标, 硬盘, 网卡等. 五种常见的 I/O 模型: 阻塞 I/O非阻塞 I/O信号驱动 I/OI/O 多路复用异步 I/O 阻塞 I/O 阻塞 I/O 的特点: 当用户发起 I/O 请求后, 进程/线程就…...

【负载均衡式在线OJ】加载题目信息(文件版)

目录 如何读取文件 -- 常见流程 代码 如何读取文件 -- 常见流程 在C中使用 std::ifstream来打开文件流是一个常见的操作&#xff0c;用于创建一个输入文件流&#xff0c;并尝试打开名为 question_list的文件。if (!in.is_open())&#xff1a;检查文件是否成功打开。如果文件未…...

“上门按摩” 小程序开发项目:基于 SOP 的全流程管理

在竞争激烈的生活服务市场,“上门按摩” 服务需求日益增长。为满足这一需求,我们启动了 O2O 模式的 “上门按摩” 小程序开发项目,该项目涵盖客户端、系统管理端、技师端。以下将通过各类 SOP 对项目进行全面管理,确保项目顺利推进。 一、项目启动 SOP:5W2H 分析法 What(…...

WPF1-从最简单的xaml开始

1. 最简单的WPF应用 1.1. App.config1.2. App.xaml 和 App.xaml.cs1.3. MainWindow.xaml 和 MainWindow.xaml.cs 2. 正式开始分析 2.1. 声明即定义2.2. 命名空间 2.2.1. xaml的Property和Attribute2.2.2. xaml中命名空间2.2.3. partial关键字 学习WPF&#xff0c;肯定要先学…...

2025牛客寒假算法营2

A题 知识点&#xff1a;模拟 打卡。检查给定的七个整数是否仅包含 1,2,3,5,6 即可。为了便于书写&#xff0c;我们可以反过来&#xff0c;检查这七个整数是否不为 4 和 7。 时间 O(1)&#xff1b;空间 O(1)。 #include <bits/stdc.h> using namespace std;signed main()…...

编译Android平台使用的FFmpeg库

目录 前言 一、编译环境 二、搭建环境 1.安装MSYS2 2.更新系统包 2.1 打开MSYS2 MinGW 64-bit终端&#xff08;mingw64.exe&#xff09; 2.2 更新所有软件包到最新版本 2.3 安装必要的工具和库。 3. 克隆FFmpeg源码 4. 配置编译选项 5. 执行编译 总结 前言 记录学习…...

【C++高并发服务器WebServer】-2:exec函数簇、进程控制

本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍 exec 函数族的作用是根据指定的文件名找到可执行文件&#xff0c;并用它来取代调用进程的内容&#xff0c;换句话说&#xff0c;就是在调用进程内部执行一个可执行文件。 exec函数族的函数执行成功后不会返回&…...

力扣707题(2)——设计链表

#题目 #3,5和6的代码 今天看剩下几个题的代码&#xff0c;1,2,4的代码已经在上篇博客写过了想看的小伙伴移步到&#xff1a; 力扣707题——设计链表-CSDN博客 //第3题头插法 void addAtHead(int val){ //记录头结点ListNode nhead; //新节点的创建,并让它指向原本头结点的后…...

K8S中ingress详解

Ingress介绍 Kubernetes 集群中&#xff0c;服务&#xff08;Service&#xff09;是一种抽象&#xff0c;它定义了一种访问 Pod 的方式&#xff0c;无论这些 Pod 如何变化&#xff0c;服务都保持不变。服务可以被映射到一个静态的 IP 地址&#xff08;ClusterIP&#xff09;、一…...

SpringBoot打包为JAR包或WAR 包,这两种打包方式在运行时端口将如何采用?又有什么不同?这篇文章将给你解惑

你们好,我是金金金。 前提 SpringBoot打包方式:不是jar就是war包 场景 写这篇文章也是我遇到一个很不理解的点,所以就去研究了一下 场景如下: 这是后端生产配置文件给项目设置的端口,然后我前端写的url是:我就很纳闷,前端写了域名以及后端服务上下文路径,咋没写端口呢,…...

zabbix6.0安装及常用监控配置

文章目录 部署zabbix-serverzabbix监控节点部署解决zabbix中文乱码创建主机组创建模版配置主机与模版关联 监控boot分区监控网卡流量出网卡流量监控进入和出的总流量监控内存监控服务器端口用户自定应监控key值 (监控mysql查询数量)zabbix触发器监控cpu监控入网卡流量 邮件告警…...

SQL-leetcode—1179. 重新格式化部门表

1179. 重新格式化部门表 表 Department&#xff1a; ---------------------- | Column Name | Type | ---------------------- | id | int | | revenue | int | | month | varchar | ---------------------- 在 SQL 中&#xff0c;(id, month) 是表的联合主键。 这个表格有关…...

JavaWeb 学习笔记 XML 和 Json 篇 | 020

今日推荐语 愿你遇见好天气,愿你的征途铺满了星星——圣埃克苏佩里 日期 学习内容 打卡编号2025年01月23日JavaWeb笔记 XML 和 Json 篇020 前言 哈喽&#xff0c;我是菜鸟阿康。 以下是我的学习笔记&#xff0c;既做打卡也做分享&#xff0c;希望对你也有所帮助…...

在Raspbian上,如何获取树莓派的CPU当前频率

本文不用汇编实现&#xff0c;因为我是要用在 Go 里的&#xff0c;Go 并不支持内联汇编&#xff0c;要用汇编比较麻烦。而且项目并不是很在意性能&#xff0c;所以直接用命令获取内核准备好的。 在Raspbian上&#xff0c;CPU 信息存放在/sys/devices/system/cpu/中&#xff0c…...

网络打印机的搜索与连接(一)

介绍 网络打印机就是可以通过网络连接上的打印机&#xff0c;这类打印机分2种&#xff1a;自身具有互联网接入功能可以分配IP的打印机我们称为网络打印机、另外一种就是被某台电脑连接上去后通过共享的方式共享到网络里面的我们称为共享打印机。现在还有一种可以通过互联网连接…...

LangChain + llamaFactory + Qwen2-7b-VL 构建本地RAG问答系统

单纯仅靠LLM会产生误导性的 “幻觉”&#xff0c;训练数据会过时&#xff0c;处理特定知识时效率不高&#xff0c;缺乏专业领域的深度洞察&#xff0c;同时在推理能力上也有所欠缺。 正是在这样的背景下&#xff0c;检索增强生成技术&#xff08;Retrieval-Augmented Generati…...

【自然语言处理(NLP)】介绍、发展史

文章目录 介绍发展史1. 规则驱动时期&#xff08;20世纪50年代-80年代&#xff09;技术特点标志性成果 2. 统计方法兴起&#xff08;1990年代-2000年代&#xff09;技术特点标志性成果 3. 神经网络复兴&#xff08;2010年代初至今&#xff09;技术特点标志性成果 4. 集成与应用…...

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…...

D3KeyHelper深度评测:5大实战技巧提升暗黑破坏神3操作效率

D3KeyHelper深度评测&#xff1a;5大实战技巧提升暗黑破坏神3操作效率 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 还在为暗黑破坏神3中复杂的技能…...

016、CI/CD流水线:用GitHub Actions把部署从玄学变成肌肉记忆

016、CI/CD流水线&#xff1a;用GitHub Actions把部署从玄学变成肌肉记忆 上周深夜&#xff0c;线上服务突然告警。紧急回滚时发现&#xff0c;测试环境通过的镜像在生产环境死活起不来。查了三个小时&#xff0c;最后发现是某位同事在Dockerfile里写死了测试数据库的IP。这种“…...

连锁经营行业商旅平台选型指南与测评排名Top 6:多门店与全链路商旅管控方案

2026年4月的第一周&#xff0c;艾美咨询发布了《2026年中国连锁经营行业商旅管理数字化白皮书》&#xff0c;数据显示国内规模以上连锁经营企业的商旅支出占整体运营成本的8.7%&#xff0c;其中私车公用、门店巡检类商旅的合规漏洞造成的浪费占总商旅支出的19.2%&#xff0c;连…...

用Python和PyTorch手把手搭建你的第一个脉冲神经网络(SNN)模型

用Python和PyTorch手把手搭建你的第一个脉冲神经网络&#xff08;SNN&#xff09;模型 当你第一次听说"脉冲神经网络"时&#xff0c;脑海中可能会浮现出科幻电影里那些会思考的机器。但事实上&#xff0c;这种模拟生物神经元工作方式的算法已经悄然走进现实。作为一名…...

Stable Yogi Leather-Dress-Collection企业应用:服装品牌AI趋势图快速验证系统

Stable Yogi Leather-Dress-Collection企业应用&#xff1a;服装品牌AI趋势图快速验证系统 1. 项目概述 Stable Yogi Leather-Dress-Collection是一款专为服装品牌设计的AI趋势图快速验证工具&#xff0c;基于先进的Stable Diffusion技术开发。这个工具能够帮助设计师和品牌快…...

一站式B站直播录制解决方案:零基础掌握BililiveRecorder高效使用指南

一站式B站直播录制解决方案&#xff1a;零基础掌握BililiveRecorder高效使用指南 【免费下载链接】BililiveRecorder 录播姬 | mikufans 生放送录制 项目地址: https://gitcode.com/gh_mirrors/bi/BililiveRecorder 在数字内容爆炸的时代&#xff0c;如何永久保存喜爱的…...

掌握N_m3u8DL-CLI-SimpleG:高效流媒体下载工具全攻略

掌握N_m3u8DL-CLI-SimpleG&#xff1a;高效流媒体下载工具全攻略 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 在数字化时代&#xff0c;视频内容已成为信息传播的重要载体&…...

nli-distilroberta-base实操手册:生产环境Nginx反向代理+HTTPS配置指南

nli-distilroberta-base实操手册&#xff1a;生产环境Nginx反向代理HTTPS配置指南 1. 项目概述 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)Web服务&#xff0c;专门用于判断两个句子之间的逻辑关系。这个轻量级模型保留了RoBERTa-base模型90%的性…...

three.ar.js 终极入门指南:10分钟快速上手 WebAR 开发

three.ar.js 终极入门指南&#xff1a;10分钟快速上手 WebAR 开发 【免费下载链接】three.ar.js A helper three.js library for building AR web experiences that run in WebARonARKit and WebARonARCore 项目地址: https://gitcode.com/gh_mirrors/th/three.ar.js th…...

突破媒体播放瓶颈:LAV Filters全方位优化指南

突破媒体播放瓶颈&#xff1a;LAV Filters全方位优化指南 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters 01 解码困境&#xff1a;为什么你的视频总是卡顿&am…...