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

JS的变量提升ES6基础

JS的变量提升&ES6基础

  • 变量
    • var关键字
      • var声明作用域
        • 实例一
        • 实例二
        • 多个变量
      • 变量提升
    • let关键字
      • 暂时性死区
      • 全局声明
      • for循环中使用let
    • const关键字

变量

ECMAScript变量时松散类型的,意思是变量可以用于保存任何类型的数据。
声明变量:var 、const、let
var 可以随意使用,而constlet只能在ES6及更晚的版本中使用。

var关键字

作用:定义变量(注意:var是一个关键字)

var name;
var name='kin';
name = 100;

var声明作用域

实例一

var操作符定义的变量会成为包含它的函数的局部变量。

function test(){
	var name = "kin";//局部变量
}
test();
console.log(name);//报错

name变量是在函数内部使用var定义的
函数叫test(),调用它会创建这个变量并给它赋值,调用之后变量随即被销毁。

实例二

在函数内定义变量时省略var操作符,可以创建一个全局变量:

function test(){
	name = "kin";//全局变量
}
test();
console.log(name);//kin

注意:
虽然可以通过该省略var操作符定义全局变量,但不推荐这么做。在局部作用域中定义的全局变量很难维护,也会造成困惑。这是因为不能一下子断定省略var是不是有意而为之。在严格模式下,如果像这样给未声明的变量赋值,则会导致抛出ReferenceError。

多个变量
var name = "kin";
	age = 12;

变量提升

function foo(){
	console.log(age);
	var age = 26;
}
foo(); // undefined

声明的变量会自动提升到函数作用域顶部
成等价于如下代码

function foo(){
	var age;
	console.log(age);
	age = 26;
}
foo();//undefined

提升------把所有变量声明都拉到函数作用域的顶部

function foo(){
	var age = 16;
	var age = 26;
	var age = 36;
	console.log(age);
}
foo();//36

反复多次使用var声明同一个变量

let关键字

let声明的范围是块作用域,var声明的范围是函数作用域。

if(true){
	var name = "kin";
	console.log(name);//kin
}
console.log(name);//kin

对比:

if(true){
	let age = 26;
	console.log(age);//26
}
console.log(age);//ReferenceError:age 没有定义

age变量不能在if块外部被引用,是因为他的作用域仅限于该块内容。
块作用域是函数作用域的子集,因此适用于var的作用域限制同样也适用于let
注意:
let也不允许同一个块作用域对一个变量重复声明。

var name;
var name;

let age;
let age;//SyntaxError;标识符age已经声明过了

由于同一个块中没有重复声明,嵌套使用相同的标识符不会报错。

var name = 'kin';
console.log(name);//kin
if(true){
	var name = '前端';
	console.log(name);//前端
}

let age = 30
console.log(age);//30

if(true){
	let age = 26;
	console.log(age);//26
}

暂时性死区

letvar重要的区别:
let声明的变量不会再作用域中被提升
var声明:

console.log(name)//undefined
var name = "kin"

let声明:

console.log(age)
let age = 18 //ReferenceError:age 没有定义

let声明之前的执行瞬间被称为“暂时性死区”,在此阶段引用任何后面才声明的变量都会抛出ReferenceError。

全局声明

使用let在全局作用域中声明的变量不会成为window对象的属性。

var name = 'kin';
console.log(window.name);//kin
let age = 26;
console.log(window.age);//undefined

for循环中使用let

使用var在for循环中定义的迭代变量会渗透到循环体外

for (var i=0;i<5;i++){
}
console.log(i);//5

使用let在循环中定义的迭代变量仅限于循环块内部

for (let i=0;i<5;i++){
}
console.log(i);//ReferenceError: i is not defined

示例:

for (var i=0;i<5;i++){
	setTimeout(()=>console.log(i),0)
}
//你认为输出的结果是:0、1、2、3、4
//实际输出:5、5、5、5、5
因为在循环退出的时候,迭代变量报错的事导致循环退出的值:5,在之后执行超时逻辑,所有的i都是同一个变量。

使用let可以解决这个问题

for (let i=0;i<5;i++){
	setTimeout(()=>console.log(i),0)
}
//0 1 2 3 4

const关键字

const的行为与let基本相同。
区别:

  • const声明变量时必须同时初始化变量
  • 修改const声明的变量会导致运行时错误
const age = 18;
age = 20 // TypeError : 给常量赋值
//const 也不允许重复声明
const name = 'kin';
const name = 'nnn';//SyntaxError

const声明的作用域也是块

const name = 'kin';
if(true){
	const name = 'nnn';
}
console.log(name);//kin

ok!目前就这些啦,大家有问题欢迎评论区讨论呀!
在这里插入图片描述


http://www.kler.cn/news/161829.html

相关文章:

  • 大数据项目——基于Django/协同过滤算法的房源可视化分析推荐系统的设计与实现
  • UE Websocket笔记
  • JAVA IO:NIO
  • IntelliJ IDEA 2023.3 最新变化
  • 力扣每日一题day30[226. 翻转二叉树]
  • Web server failed to start. Port 8888 was already in use.
  • 点评项目——商户查询缓存
  • 前端实现token无感刷新的原因和步骤
  • Linux Docker 安装Nginx
  • 【Linux】Java 程序员必会的 Linux 最常用的命令
  • 小纸条..
  • ubuntu源配置文件/etc/apt/sources.list不存在
  • C语言实现水仙花
  • PostgreSQL 技术内幕(十二) CloudberryDB 并行化查询之路
  • Python文件操作(txt + xls + json)
  • class035 数据结构设计高频题【算法】
  • Chromium包含的内容(引擎)
  • Eureka的使用说明
  • 【react】动态页面转换成html文件下载,解决样式问题
  • Pytorch CIFAR10图像分类 Swin Transformer篇
  • 学会使用这个魔法棒,再也不用在容器里安装乱七八糟的命令工具了!
  • 数据结构如何影响程序的错误检测和调试?
  • Django模板,Django中间件,ORM操作(pymysql + SQL语句),连接池,session和cookie, 缓存
  • N个数求和
  • 时间片轮转调度算法
  • 【CMake入门】第四节——静态库和共享库及安装、使用库的流程
  • [足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-6复数Complex Number
  • mysql中information_schema.tables字段说明
  • Linux UUCP命令教程:如何在Linux系统中进行文件复制(附实例详解和注意事项)
  • 12.7作业