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.rhkb.cn/news/5686.html

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

相关文章

Java 8 实战 书籍知识点散记

一、Lambda表达式 1.1 Lambda表达式的一些基本概念 1.2 Lambda表达式的三个部分 // 简化前Comparator<Apple> byWeightnew Comparator<Apple>() {public int compare(Apple a1, Apple a2){return a1.getWeight().compareTo(a2.getWeight());}};//Lambda表达式Comp…

XCP 协议基础

文章目录 一、XCP 简介二、XCP的主要功能三、什么是标定四、什么时候进行标定五、标定的意义六、标定的三层架构XCP协议 和 CCP协议的区别参考 一、XCP 简介 XCP 协议的全称为 eXtended Calibration Protocol&#xff0c;即扩展标定协议。 另有其他定义&#xff0c;XCP 协议全…

医学图像分析工具09.1:Brainstorm安装教程

1. 安装前准备 **官方安装包和数据&#xff1a;**https://neuroimage.usc.edu/bst/download.php **官方安装教程&#xff1a;**https://neuroimage.usc.edu/brainstorm/Installation Matlab 版本要求&#xff1a; 有 Matlab&#xff1a; R2009b (7.9) 或更高版本没有 Matlab&…

python创建一个httpServer网页上传文件到httpServer

一、代码 1.server.py import os from http.server import SimpleHTTPRequestHandler, HTTPServer import cgi # 自定义请求处理类 class MyRequestHandler(SimpleHTTPRequestHandler):# 处理GET请求def do_GET(self):if self.path /:# 响应200状态码self.send_response(2…

vue3搭建实战项目笔记

vue3搭建实战项目笔记 搭建项目笔记1.1.创建Vue项目1.2.划分目录结构assets -> 资源&#xff08;css/font/img&#xff09;components -> 抽取出来的公共组件hooks -> 组件对应的公共逻辑抽取到hooks文件夹下router -> 路由mock -> 模拟数据的一些配置service -…

OneData体系架构详解

阿里巴巴的 OneData 体系架构方法论&#xff0c;主要分为三个阶段&#xff1a;业务板块、规范定义 和 模型设计。每个阶段的核心目标是确保数据的高效管理、共享与分析能力。 一. 业务板块&#xff08;Business Segment&#xff09; 业务板块是OneData体系架构中的第一步&…

[Computer Vision]实验三:图像拼接

目录 一、实验内容 二、实验过程及结果 2.1 单应性变换 2.2 RANSAC算法 三、实验小结 一、实验内容 理解单应性变换中各种变换的原理&#xff08;自由度&#xff09;&#xff0c;并实现图像平移、旋转、仿射变换等操作&#xff0c;输出对应的单应性矩阵。利用RANSAC算法优…

在 vscode + cmake + GNU 工具链的基础上配置 JLINK

安装 JLINK JLINK 官网链接 下载安装后找到安装路径下的可执行文件 将此路径添加到环境变量的 Path 中。 创建 JFlash 项目 打开 JFlash&#xff0c;选择新建项目 选择单片机型号 在弹出的窗口中搜索单片机 其他参数根据实际情况填写 新建完成&#xff1a; 接下来设置…

ue5 GAS制作一个技能

新建文件夹 ability 取名BP_BaseAbility 新建一个技能GAB_Melee 上面技能GAB_Melee和技能基类BP_BaseAbility 进入技能GAB_Melee&#xff0c;添加打印火云掌 给这个技能添加标签 点这个号 这样命名&#xff0c;小心这个点&#xff08;.&#xff09;作为分割 ability.ha…

小米Vela操作系统开源:AIoT时代的全新引擎

小米近日正式开源了其物联网嵌入式软件平台——Vela操作系统&#xff0c;并将其命名为OpenVela。这一举动在AIoT&#xff08;人工智能物联网&#xff09;领域掀起了不小的波澜&#xff0c;也为开发者们提供了一个强大的AI代码生成器和开发平台。OpenVela项目源代码已托管至GitH…

opentelemetry-collector docker安装

一、编写配置 nano /root/otelcol-config.yamlreceivers:otlp:protocols:grpc:endpoint: 0.0.0.0:4317http:endpoint: 0.0.0.0:4318 exporters:debug:verbosity: detailed service:pipelines:traces:receivers: [otlp]exporters: [debug]metrics:receivers: [otlp]exporters: …

Arweave的出块原理

一、Arweave 关键技术 1.1数据结构&#xff1a;Blockweave 区块纺 区块坊中包括区块哈希列表和钱包列表。拥有区块哈希列表使旧区块可以被请求/验证&#xff0c;拥有钱包列表可以验证新交易&#xff0c;而无需处理钱包上一次交易所在的区块。区块哈希列表和钱包列表由矿工保持…

寒假刷题记录

4968. 互质数的个数 - AcWing题库 涉及&#xff1a;快速幂&#xff0c;欧拉函数&#xff0c;分解质因数 #include <bits/stdc.h> #define fi first #define se second #define endl \n #define pb push_backusing namespace std; using LL long long;const int mod 9…

免费下载 | 2024中国智算中心产业发展白皮书

以下是《2024中国智算中心产业发展白皮书》的核心内容整理&#xff1a; 一、智算中心产业发展背景及内涵 背景&#xff1a;智算中心作为新型基础设施&#xff0c;是数字经济的重要支撑&#xff0c;随着人工智能技术的快速发展&#xff0c;智算中心的需求日益增长。 内涵&#…

爬虫基础之爬取某站视频

目标网址:为了1/4螺口买小米SU7&#xff0c;开了一个月&#xff0c;它值吗&#xff1f;_哔哩哔哩_bilibili 本案例所使用到的模块 requests (发送HTTP请求)subprocess(执行系统命令)re (正则表达式操作)json (处理JSON数据) 需求分析: 视频的名称 F12 打开开发者工具 or 右击…

软件测试入门—用例设计中的场景图和状态迁移图

在软件测试领域&#xff0c;用例设计是一项至关重要的工作&#xff0c;它直接关系到软件质量的高低。而场景图和状态迁移图作为用例设计中的两种有效工具&#xff0c;能够帮助测试人员更全面、系统地设计测试用例。下面我们就来深入了解一下这两种图。 一、场景图 场景图主要…

Java面试专题——面向对象

面向过程和面向对象的区别 面向过程&#xff1a;当事件比较简单的时候&#xff0c;利用面向过程&#xff0c;注重的是事件的具体的步骤/过程&#xff0c;注重的是过程中的具体的行为&#xff0c;以函数为最小单位&#xff0c;考虑怎么做。 面向对象&#xff1a;注重找“参与者…

软件测试—— 接口测试(HTTP和HTTPS)

软件测试—— 接口测试&#xff08;HTTP和HTTPS&#xff09; HTTP请求方法GET特点使用场景URL结构URL组成部分URL编码总结 POST特点使用场景请求结构示例 请求标头和响应标头请求标头&#xff08;Request Headers&#xff09;示例请求标头 响应标头&#xff08;Response Header…

顺序表和链表(详解)

线性表 线性表&#xff08; linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。…

初阶5 排序

本章重点 排序的概念常见排序的算法思想和实现排序算法的复杂度以及稳定性分析 1.排序的概念 排序: 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性: 假定在待排序的记录序列中&#xff0…