var 声明
- 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象;
- 声明变量为全局, 可重复声明变量,可以再次赋值;
var str ; // undefined
str = 'string' // 'string'
if(true){
var str = 'S' ;
var num = 0
}
console.log(str) // 'S'
console.log(num) // 0
let 声明
- 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升;
- 存在作用域死区; 可以再次赋值;
- 只能再当前块级作用域中访问 ( { } 为界限 ) ,
let str ; // undefined
str = 'string' // 'string'
if(true){
// Uncaught SyntaxError: Identifier 'str' has already been declared
let str = 0 ; // 已声明标识符 “str”
let num = 0
}
console.log(str) // 'string'
console.log(num) // Uncaught TypeError: Cannot read properties of undefined
var i = 0;
var arr = []
for(let i =0; i<5;i++){
// let 不会对全局变量造成影响
arr.push( function(){ return i } )
}
arr.forEach(i=>{
console.log( i() ) // 0 1 2 3 4
})
const 声明
- 使用const声明的是常量,在后面出现的代码中不能再修改该常量的值;
- 存在作用域死区,且声明之后必须赋值;
- 和 let 一样同样存在块级作用域 ( { } 为界限 ) ;
{
const str ;
// Uncaught SyntaxError: Missing initializer in const declaration
// 常量声明中缺少初始值设定项
}
{
const str = ''
str = 0
// Uncaught TypeError: 无法分配给常量变量
}
if(true){
const str = 'String' ;
var num = 0
}
console.log(num) // 0
console.log(str) // Uncaught TypeError: Cannot read properties of undefined
let 和 const 存在作用域死区
- 读取变量时如果当前的块级作用域 存在这个变量会读取当前作用域的变量
- 而let 和 const 声明的不存在变量提升 就会引起报错;
var str = ''
function fn(){
// Uncaught ReferenceError: Cannot access 'str' before initialization at fn
// 不能在fn中初始化之前访问“str”
console.log(str)
// 以上为作用域死区
let str = 456
// 此处 let 或 const 都会引起报错
}
fn()