JS 各个声明的差异;
- 首先明确的是 ,最开始 js 中只有
var
, - 在ES6 引入
let
与const
目的就是为了解决一些var 的缺陷提出来的, 例如 变量提升, 以及没有作用域的概念
以下例子, 均可以 使用
var let const
, 来替换, 加深理解
var:
会是变量的提前, 而且可以多次赋值会自动覆盖 并 存在预解析的作用;(关于预解析详见我另一篇博客)
https://blog.csdn.net/ZHXT__/article/details/97695626
var 与直接function 创建的函数都会存在变量提升, 并且从下面的例子,可以知道, function的优先级大于var声明的, (当然我们在正式开发中一般不会这样命名)
var a=10;
//等价于 先, var a; 变量会提升(这一步会在最前面)
//在 赋值 a = 10 ;
function fn() {
console.log('a', a);
var a = 1;
function a () {
console.log('I am a function');
}
}
fn() // ƒ a () {console.log('I am a function');}
- 这里可以尝试分别改成
let const
, 来进行测试
(毕竟自己动手得到的东西才是自己的)
//存在变量提升
if(1){
console.log(a);
var a=1
}
console.log(a);
let
1,不支持变量提升,即不支持变量声明预解析,只能先声明后使用(有特殊情况);
2,支持块级作用域
3,不允许重复声明
let a=1;
a=3; //可以换成const 试试
- let 不会成为全局变量
let a = 1;
console.log(window.1); // undefined
- 值得注意的是:
如下这个例子
let a = '123';
if(true) {
console.log(a);//Uncaught ReferenceError: a is not defined
let a = "123";
}
报出错误 a 没有被定义,而不是引用了全局作用域里的 a,说明 let 声明的 a 也被提升了。
原因是 let 设计中的暂时性死区:
当前作用域顶部到该变量声明位置中间的部分,都是该let变量的死区, 在死区中,禁止访问该变量。
| 由此,我们给出结论,let声明的变量存在变量提升, 但是由于死区我们无法在声明前访问这个变量。
在这里插入代码片
const
1,不支持变量提升,即不支持变量声明预解析,只能先声明后使用;
2,支持块级作用域(即 { } 代码块中)
3,不允许重复声明
4,与let特性不一致的一点:必须初始化,不允许修改
const a=10; //一经赋值将不可以修改
=============================================
最后在提一下直接赋值变量 即:
a=10;
这个变量a 即为全局变量此时相当于window.a=10;
这个与this的指向也是一样的,若以函数形式调用时this 指向的对象就是window
如果认为写的不好的,可以看看大佬写的:ES6
最 后 : 最后: 最后:
在实际的使用中, 我们还是都加使用最新的 let const
, 毕竟 是为了满足var 什么存在的缺陷的