var 关键字
- 使用var声明的变量是函数级作用域
- 使用var 声明的变量,其作用域为改语句所在的函数内,存在变量提升现象。
?第一种情况:
<script type="text/javascript">
console.log(a);
var a = 10;
------------------------------------------------------------------------------------------
//上面的代码相当于是进行了一下操作
var a;
console.log(a); //undefined
a = 10
</script>
?第二种情况:
<script type="text/javascript">
function fn() {
console.log("hello world");
}
fn()
-------------------------------------------------------------------------------------------
//函数声明提升(函数声明提升直接把整个函数提到执行环境的最顶端)
fn()
function fn() {
console.log("hello world");
}
</script>
let关键字
1.ES6中新增了用于声明变量的关键字 ,let声明的变量只在所处于的块级有效
<script>
// let声明的变量只在所处于的块级有效
if (true) {
let a = 10;
}
console.log(a) // a is not defined
</script>
2.不存在变量提升
<script>
// 使用let关键字声明的变量没有变量提升
console.log(a);
let a = 10;
</script>
3.存在暂时性死区
<script>
//利用let声明的变量会绑定在这个块级作用域,不会受外界的影响
var a = 10;
function(){
a = 100;
let a; //造成暂时性死区,let声明的变量不会进行变量提升,这里不能不声明就赋值
}
</script>
4.在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的
<script>
/* ----在一个大括号中 使用let关键字声明的变量才具有块级作用域 var关键字是不具备这个特点的----*/
if (true) {
let num = 100;
var abc = 200;
}
console.log(abc);
console.log(num) // num is not defined
</script>
5.防止循环变量变成全局变量
<script>
for (let i = 0; i < 2; i++) {
console.log(i)
}
console.log(i); // i is not defined
<script>
const关键字
1.声明常量,常量就是值(内存地址)不能变化的量?
const PI = 3.14;
2.?声明常量时必须赋值
const PI; // Missing initializer in const declaration
3.?常量赋值后,值不能修改
const PI = 3.14; PI = 10; // Assignment to constant variable.
4.?具有块级作用域
<script>
if (true) {
const a = 10;
if (true) {
const a = 20;
console.log(a); // 20
}
console.log(a); // 10
}
console.log(a); // a is not defined
</script>
总结:
-
使用 var 声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象 -
使用 let 声明的变量,其作用域为该语句所在的代码块内,不存在变量提升 -
let和const声明不允许在同一个作用域重复声明同一个变量,但是var可以 -
使用 const 声明的是常量,在后面出现的代码中不能再修改该常量的值,但是const声明的对象的属性是可以修改的 -
const声明的常量与let一样,必须先声明后使用,只在块级作用域内有效
|