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 都是undefined
	console.log("1", a, b);  //1 undefined undefined

	// 这里对 a b 进行初始化
	var a = 12, b="34";

	function foo(){
		// 这里换了一个作用域,也就是在方法体内部
		// 由于在这个作用域中又定义了一个 a 变量,所以 a 会被提到当前作用域(方法内)的最上面
		// 但不会初始化,所以这里的 a 其实是方法中新定义的 a ,所以是undefined,
		// 方法中没有重新定义 b,所以还用方法外面定义且初始化好的 b
		console.log("2", a, b); //2 undefined 34

		// 这里重新对方法中定义的 a 进行初始化
		var a=b=12;

		// 上面对方法中定义的 a 初始化,所以这里输出 方法中定义的 a 和 外面定义的 b 都是12
		console.log("3", a, b);  //3 12 12
	}

	foo()

	//这里输出的是 外面定义的 a ,外面定义的 b ,由于b在方法中被修改为12
	console.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 都是undefined
	console.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 都是12
		console.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,所以会报错

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2025数学建模美赛|赛题翻译|E题

2025数学建模美赛&#xff0c;E题赛题翻译 更多美赛内容持续更新中...

Android AOP:aspectjx

加入引用 在整个项目的 build.gradle 中&#xff0c;添加 classpath "com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10" 可以看到测试demo的 gradle 版本是很低的。 基于 github 上的文档&#xff0c;可以看到原版只支持到 gradle 4.4 。后续需要使…

【SpringBoot教程】Spring Boot + MySQL + HikariCP 连接池整合教程

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 在前面一篇文章中毛毛张介绍了SpringBoot中数据源与数据库连接池相关概念&#xff0c;今天毛毛张要分享的是关于SpringBoot整合HicariCP连接池相关知识点以及底层源码…

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统&#xff08;GIS&#xff09;在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…

计算机的错误计算(二百二十三)

摘要 利用大模型化简计算 实验表明&#xff0c;大模型不仅给出了不精确的结论&#xff0c;而且有些表述是错误的。 例1. 计算摘要中算式。 下面是与一个大模型的对话。 点评&#xff1a; &#xff08;1&#xff09;16位的正确值是 0.9999999999051034e-11&#xff08;ISRe…

Edge-TTS在广电系统中的语音合成技术的创新应用

Edge-TTS在广电系统中的语音合成技术的创新应用 作者&#xff1a;本人是一名县级融媒体中心的工程师&#xff0c;多年来一直坚持学习、提升自己。喜欢Python编程、人工智能、网络安全等多领域的技术。 摘要 随着人工智能技术的快速发展&#xff0c;文字转语音&#xff08;Te…

【PyQt5】数据库连接失败: Driver not loaded Driver not loaded

报错内容如下&#xff1a; 可以看到目前所支持的数据库驱动仅有[‘QSQLITE’, ‘QMARIADB’, ‘QODBC’, ‘QODBC3’, ‘QPSQL’, ‘QPSQL7’] 我在网上查找半天解决方法未果&#xff0c;其中有一篇看评论反馈是可以使用的&#xff0c;但是PyQt5的版本有点低&#xff0c;5.12…

STM32 旋转编码器

旋转编码器简介 旋转编码器&#xff1a;用来测量位置、速度或旋转方向的装置&#xff0c;当其旋转轴旋转时&#xff0c;其输出端可以输出与旋转速度和方向对应的方波信号&#xff0c;读取方波信号的频率和相位信息即可得知旋转轴的速度和方向 类型&#xff1a;机械触点式/霍尔传…

javascript格式化对象数组:ES6的模板字符串、map

文章目录 引言I 使用模板字符串格式化对象数组使用ES6的模板字符串可以更方便地格式化对象数组。安装 es6-string-html 扩展II 使用map方法格式化对象数组map基本语法使用数组的map方法格式化III 使用for循环格式化对象数组IV 知识扩展: map 的常见用法和示例转换数组元素提取…

【Linux】磁盘

没有被打开的文件 文件在磁盘中的存储 认识磁盘 磁盘的存储构成 磁盘的效率 与磁头运动频率有关。 磁盘的逻辑结构 把一面展开成线性。 通过扇区的下标编号可以推算出在磁盘的位置。 磁盘的寄存器 控制寄存器&#xff1a;负责告诉磁盘是读还是写。 数据寄存器&#xff1a;给…

文档智能扫描,提升无纸化办公效率

随着无纸化办公的推广和移动设备的普及&#xff0c;用户迫切需要将纸质文档快速、准确地转换成电子格式&#xff0c;以提高工作效率和信息管理的便捷性。同时&#xff0c;用户将文档扫描成电子版后&#xff0c;可以自行通过加密和访问控制提高电子文档的安全性&#xff0c;以满…

【PyTorch】4.张量拼接操作

个人主页&#xff1a;Icomi 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&#xff0c;能够处理复杂的数据模式。通过 PyTorch&#xff0…

Cursor 帮你写一个小程序

Cursor注册地址 首先下载客户端 点击链接下载 1 打开微信开发者工具创建一个小程序项目 选择TS-基础模版 官方 2 然后使用Cursor打开小程序创建的项目 3 在CHAT聊天框输入自己的需求 比如 小程序功能描述&#xff1a;吃什么助手 项目名称&#xff1a; 吃什么小程序 功能目标…

Yolo11 + OCR 营业执照识别+信息抽取(预期后续改用其他ocr更简单,推理预计使用onnxruntim加速,分c++和python两种方式部署)

目录 一 数据集制作 1 labelimg的安装与使用 2 标注方式 3 数据集制作 二 模型训练 三 使用Yolo11 + OCR 实现“营业执照”信息解析完整方案 1 cutLinesforcode.py 2 getBusinessLicenseContentPart.py 3 getPartWords.py 4 pdfTojpg.py 5 main.py 本项目可用于毕业…

Python GUI 开发 | PySide6 辅助工具简介

关注这个框架的其他相关笔记&#xff1a;Python GUI 开发 | PySide6 & PyQt6 学习手册-CSDN博客 在上一章中&#xff0c;我们介绍了如何搭建 PySide6 & PyQt6 的开发环境。在搭建环境的时候我们配置了几个几个快捷工具&#xff0c;很多小伙伴可能都不知道是干啥用的。那…

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…

Windows Docker Desktop安装及使用 Docker 运行 MySQL

Docker Desktop是Docker的官方桌面版&#xff0c;专为Mac和Windows用户设计&#xff0c;提供了一个简单易用的界面来管理和运行Docker容器。它集成了Docker引擎&#xff0c;为开发人员提供了一个快速、可靠、可扩展的方式来构建、运行和管理应用。DockerDesktop的优势在于&…

python基础语法(4) ----- 学习笔记分享

目录 Python 使用库 以及 实战的一些案例 1. 标准库 1.1 认识标准库 1.2 使用import导入模块 1.3 代码示例:日期及结算 1.4 代码示例:字符串操作 1.5 代码示例 : 文件查找工具 2. 第三方库 2.1 认识第三方库 2.2 使用pip 2.3 代码示例:生成二维码 (1) 使用搜索引擎,…

Python-基础环境(01) 虚拟环境,Python 基础环境之虚拟环境,一篇文章助你完全搞懂!

Python的虚拟环境是一种工具&#xff0c;它能够创建一个隔离的独立Python环境。每个虚拟环境都有自己独立的Python解释器和安装的包&#xff0c;不会与其他虚拟环境或系统的全局Python环境发生冲突。虚拟环境特别适用于以下情况&#xff1a; 项目隔离&#xff1a;不同的项目可…