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

news2025/1/24 9:50:50

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

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

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

相关文章

麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 防火墙在运维工作中有着不可或缺的重要性。首先&#xff0c;它是保障网络安全的关键防线&#xff0c;通过设置访问控制规则&#xff0c;可精准过滤非法网络流量&#xff0c;有效阻挡外部黑客攻击、恶…

【AI编辑器】字节跳动推出AI IDE——Trae,专为中文开发者深度定制

目录 一、背景 二、核心特性 2.1 AI驱动的代码自动生成 2.2 智能问答与代码补全 2.3 多语言支持 2.4 插件与扩展 三、架构 四、下载使用 4.1 下载与安装 4.2 界面与配置 五、应用实践 5.1 快速生成代码 5.2 智能问答与调试 5.3 团队协作与代码审查 六、与Cursor…

机器学习2 (笔记)(朴素贝叶斯,集成学习,KNN和matlab运用)

朴素贝叶斯模型 贝叶斯定理&#xff1a; 常见类型 算法流程 优缺点 集成学习算法 基本原理 常见方法 KNN&#xff08;聚类模型&#xff09; 算法性质&#xff1a; 核心原理&#xff1a; 算法流程 优缺点 matlab中的运用 朴素贝叶斯模型 朴素贝叶斯模型是基于贝叶斯…

【赵渝强老师】K8s中Pod探针的HTTPGetAction

在K8s集群中&#xff0c;当Pod处于运行状态时&#xff0c;kubelet通过使用探针&#xff08;Probe&#xff09;对容器的健康状态执行检查和诊断。K8s支持三种不同类型的探针&#xff0c;分别是&#xff1a;livenessProbe&#xff08;存活探针&#xff09;、readinessProbe&#…

每日十题八股-2025年1月23日

1.快排为什么时间复杂度最差是O&#xff08;n^2&#xff09; 2.快排这么强&#xff0c;那冒泡排序还有必要吗&#xff1f; 3.如果要对一个很大的数据集&#xff0c;进行排序&#xff0c;而没办法一次性在内存排序&#xff0c;这时候怎么办&#xff1f; 4.面试官&#xff1a;你的…

bat批处理删除此电脑左侧及另存为下文档视屏等多余项

发现的一个解决强迫症人士痛点的小方法&#xff0c;自整理为一键批处理&#xff0c;需者自取 他可以一键去掉电脑左侧及另存为下文档视屏等多余项&#xff0c;还界面一个清爽整洁 干干净净&#xff0c;舒服 分享的是bat文件&#xff0c;可以右键编辑查看源代码&#xff0c;绝…

计算机毕业设计hadoop+spark+hive图书推荐系统 豆瓣图书数据分析可视化大屏 豆瓣图书爬虫 知识图谱 图书大数据 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

ThinkPhp伪静态设置后,访问静态资源也提示找不到Controller

ThinkPhp没有配置伪静态时&#xff0c;除了默认的IndexController能访问&#xff0c;其他路由Controller都访问不到&#xff0c;提示404错误。配置了伪静态后就解决了这个问题。 但是当我的ThinkPhp后台项目中有静态资源放在public目录&#xff08;或子目录&#xff09;中需要…

HarmonyOS:通过(SQLite)关系型数据库实现数据持久化

一、场景介绍 关系型数据库基于SQLite组件&#xff0c;适用于存储包含复杂关系数据的场景&#xff0c;比如一个班级的学生信息&#xff0c;需要包括姓名、学号、各科成绩等&#xff0c;又或者公司的雇员信息&#xff0c;需要包括姓名、工号、职位等&#xff0c;由于数据之间有较…

豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”

&#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | &#x1f40d; 蛇年运势预测 在线体验地址&#xff1a;蛇年…

JAVA-快速排序

一、快速排序基本思想 快速排序是 Hoare 于 1962 年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a; 任取待排序元素序列中的某元 素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#…

acm培训 part 1(题解)

第一部分的培训为语法糖&#xff0c;stl容器以及复杂度。 题目分析 1.1 Long Loong AtCoder - abc336_a ​​ 这道题的重点在于多个o的输出。在保证前面‘L’ 的输出和后面‘ng’的输出下&#xff0c;输入需要输出的o的数字&#xff0c;来实现需要输出的效果。 代码如下 …

vulfocus/fastjson-cnvd_2017_02833复现

漏洞概述 Fastjson 是阿里巴巴开发的一个高性能的 Java 库&#xff0c;用于将 Java 对象转换成 JSON 格式&#xff08;序列化&#xff09;&#xff0c;以及将 JSON 字符串转换回 Java 对象&#xff08;反序列化&#xff09;。 fastjson在解析json的过程中,支持使用type字段来指…

Ceisum无人机巡检直播视频投射

接上次的视频投影&#xff0c;Leader告诉我这个视频投影要用在两个地方&#xff0c;一个是我原先写的轨迹回放那里&#xff0c;另一个在无人机起飞后的地图回显&#xff0c;要实时播放无人机拍摄的视频&#xff0c;还要能转镜头&#xff0c;让我把这个也接一下。 我的天&#x…

一句话,我让 AI 帮我做了个 P 图网站!

每到过节&#xff0c;不少小伙伴都会给自己的头像 P 个图&#xff0c;加点儿装饰。 比如圣诞节给自己头上 P 个圣诞帽&#xff0c;国庆节 P 个小红旗等等。这是一类比较简单、需求量却很大的 P 图场景&#xff0c;也有很多现成的网站和小程序&#xff0c;能帮你快速完成这件事…

【深度学习】 自动微分

自动微分 正如上节所说&#xff0c;求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单&#xff0c;只需要一些基本的微积分。 但对于复杂的模型&#xff0c;手工进行更新是一件很痛苦的事情&#xff08;而且经常容易出错&#xff09;。 深度学习框架通过自动…

Go语言中的值类型和引用类型特点

一、值类型 值类型的数据直接包含值&#xff0c;当它们被赋值给一个新的变量或者作为参数传递给函数时&#xff0c;实际上是创建了原值的一个副本。这意味着对新变量的修改不会影响原始变量的值。 Go中的值类型包括&#xff1a; 基础类型&#xff1a;int&#xff0c;float64…

Vue2 项目二次封装Axios

引言 在现代前端开发中&#xff0c;HTTP请求管理是构建健壮应用的核心能力之一。Axios作为目前最流行的HTTP客户端库&#xff0c;其灵活性和可扩展性为开发者提供了强大的基础能力。 1. 为什么要二次封装Axios&#xff1f; 1.1 统一项目管理需求 API路径标准化&#xff1a;…

使用Layout三行布局(SemiDesign)

tips&#xff1a;Semi Design网址 &#xff1a;Semi Design 1、安装Semi # 使用 npm npm i douyinfe/semi-ui# 使用 yarn yarn add douyinfe/semi-ui# 使用 pnpm pnpm add douyinfe/semi-ui 2、引入Layout布局 import { Layout } from douyinfe/semi-ui;3、开始实现三行布局…

css命名规范——BEM

目录 引言 BEM是什么? 块Block 元素Element 修饰语Modifier BEM解决了哪些问题? 在流行框架的组件中使用 BEM 格式 实战 认识设计图 如何使用当前的css规范正确命名? 引言 css样式类命名难、太难了,难于上青天,这个和js变量命名还不一样。看看项目中五花八门的样…