(let和const)与 var的区别
(1)var可以重复声明变量
var num = 100
var num = 200
console.log(num)
//打印出来200
let和const不能重复声明变量
let n=20
let n=30
console.log(n)
//浏览器报错
Uncaught SyntaxError: Identifier 'n' has already been declared
const m=20
const m=30
console.log(m)
//浏览器报错
//Uncaught SyntaxError: Identifier 'n' has already been declared
(2)下面我们再看一个例子
console.log(num)
var num = 100
console.log(num)
//结果是这样的 undefined 和 100
有人会说为啥呀?
我说一下我的理解,这是因为var的预解析(可以在赋值之前调用,只不过是 undefined)
而let和const声明的变量不进行预解析(就是在声明之前不能调用),我们看一下边的例子
console.log(num)
let num =100
//浏览器报错:不能在初始化之前读取,而不是报undefined
//const 也会这样报错
(3)var只被函数限制作用域
function fn(){
var num = 100
}
fn()
console.log(num)
//报错:Uncaught ReferenceError: num is not defined
如果是这样放在if里,可以得到结果因为if的大括号不限制num的作用域
if(true){
var num = 100
}
console.log(num)
//结果:100
注意好此时我们把if里的var换成let
if(true){
let num = 100
}
console.log(num)
结果就报错了num is not defined,这是为啥呢?因为let和const会生成块级作用域,大白话说就是会被任何一个{…}限制使用范围,所以知道怎么让上边的显示结果了吗,就是把 console.log(num) 放到if的条件里
(4)let和const的区别
①let可以在声明的时候不进行赋值,const必须赋值
②let声明的变量可以重新赋值,const一经赋值不能更改
那么我们来看个例子
const obj={
name:'Jack'
}
obj.name='Dave'
console.log(obj.name)
打印的是 Dave ,因为obj是地址,只要地址不变,对他进行任何操作都可以
这篇文章前边有个名词叫预解析,这里我来说一下什么是预解析,也可以叫他预解释
在代码执行之前进行解释,当代码开始执行的时候表示预解析结束。解析的是两个东西:①声明式函数function fn() {}②var关键字
预解析在做什么:
①把var声明的变量提前
②把声明式函数提前,会把函数名当做变量提前,并且告诉浏览器这个变量的存储的是一个函数地址
看个小例子
fn()//在这个函数执行之前,浏览器就知道了这个变量被定义过,并且代表的是函数地址,所以可以当函数执行
function fn(){}
fn()
//这段代码的真实执行顺序就是:
//function fn(){}
//fn()
//fn()
有不对的地方请大家评论指教✿✿ヽ(°▽°)ノ✿