概述
1.var 存在变量声明提升,赋值不会提升, 而let 与const不存在变量提升
2.var 定义的变量可以声明很多次,而let. const定义的变量只能声明一次
3.var.let声明的变量可以再次赋值,而const声明的变量不能再次赋值
4.var声明的变量没有自身的作用域,而let、const声明的变量有自身的作用域(块级作用域
5. 利用var定义的变量,会自动挂载到window,但是let和const不会
6.var定义的变量会有提升函数也有提升(最高,比var定义变量还高。),let和const 存在暂时性死区问题
console.log(a);//undefined 不会报错 因为var 有变量提升
var a=1;
上面的等价于 var a; console.log(a) ;a=1;
但如果是单独console.log(a); 会报错 a未定义
console.log(a);//会报错、未定义 因为let没有变量提升 需要先申明在赋值
let a=1;
7.let const let定义变量 const定义常量
总结:var定义的变量 声明存在提升
console.log(a);
var a=123 ;
console.log(a);
等价于=>
var a;
console.log(a); //a声明提升 赋值未提升 ,所以为undefined
a=123;
console.log(a); //a重新赋值,值为123
声明函数存在变量提升,优先级大于var 关键字声明。且同名函数后的声明不会覆盖,但会被变量赋值后覆盖。
console.log(a);
var a=123 ;
console.log(a);
function a(){};
等价于=>
var a=function(){};
var a; //此时a 是同名声明,不会覆盖a,a的值为[function:a]
console.log(a); //[function:a]
a=123; //此时a变量重新赋值,会被覆盖,此时a的值为123
console.log(a);//123
练习题:
console.log(bar); // f bar() { console.log(123) }
console.log(bar()); // undefined
var bar = 456;
function bar() {
console.log(123); // 123
}
console.log(bar); // 456
bar = 789;
console.log(bar); // 789
console.log(bar()) // bar is not a function
//等同于
var bar=function () {
console.log(123);
}
var bar;
console.log(bar); //bar是一个函数, 后面var bar只声明 不复制是不会覆盖bar 所以bar还是function
console.log(bar()); //执行bar里的console
bar = 456;
console.log(bar);
bar = 789;
console.log(bar);
//console.log(bar()); //[typeError]:bar is not a function
// js执行结果
// [function:bar] { console.log(123) }
// 123 // 执行bar()里的console.log
// undefined // bar()的返回值,如果函数没有返回值,默认为:undefined
// 456
// 789
// [typeError]:bar is not a function
函数提升
javascript中不仅仅是变量声明有提升的现象,函数的声明也是一样;具名函数的声明有两种方式:
1. 函数声明式 2. 函数字面量式(没有提升)
//函数声明式
function bar () {}
//函数字面量式
var foo = function () {}
函数字面量式的声明合变量提升的结果是一样的,函数只是一个具体的值;
但是函数声明式的提升现象和变量提升略有不同
console.log(bar());
function bar () {
console.log(1);
}
执行顺序相当于:
function bar () {
console.log(1);
}
console.log(bar());
结果
1
undefined 应为执行一个函数没有返回值 默认返回 undefined
函数提升是整个代码块提升到它所在的作用域的最开始执行
思考下面的问题(看明白函数声明式提升下面的问题大概可以理解为什么输出1而不是2了吧):
foo(); //1
var foo;
function foo () {
console.log(1);
}
foo = function () {
console.log(2);
}
最后
以上就是真实毛豆为你收集整理的ES6的Const Let Var的区别的全部内容,希望文章能够帮你解决ES6的Const Let Var的区别所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复