块级作用域 、变量提升、暂时性死区、不可重复申明
let t
var t
//error
var t=1;
console.log(window.t);
// 1
let t=1;
console.log(window.t)
//undefined let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性
let t;
{
var t
}
//error
var t=1;
{
let t=2
console.log(t)
}
// 1
console.log(t)
let t
//error
console.log(t)
//error
typeof t
//undefined
console.log(t)
var t=1
//undefined
var t=1;
function(){
console.log(i)
var t=1
}
//undefined
var t=1;
(function(){
console.log(i)
let t=1
})()
//error
let t=1;
(function(){
console.log(i)
var t=1
})()
//undefined
var t=[]
for(var i=0;i<10;i++){
t[i]=function(){
console.log(i)
}
}
t[0]();t[9]();
console.log(i)
// 10 10
//10
var t=[]
for(let i=0;i<10;i++){
t[i]=function(){
console.log(i)
}
}
t[0]();t[9]();
// 0 9
for(let i=0;i<2;i++){
let i=5;
console.log(i)
}
// 5 5 执行2次 而不是1次
函数申明相关
允许在块级作用域内声明函数。
函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
同时,函数声明还会提升到所在的块级作用域的头部。
t()
{
function t(){ console.log(1) }
}
//error
{
t()
function t(){ console.log(1)}
}
//1
function t(){ console.log(1) }
{
function t(){ console.log(2) }
function tt(){ console.log(3) }
t()
}
t();tt()
//2 2 3
t();
function t(){ console.log(1) }
//1
t()
if(1){
function t(){ console.log(1) }
}
// error
if(1){
function t(){ console.log(1) }
}
t()
//1
if(0){
function t(){ console.log(1) }
}
t()
//error
function t() { console.log('1'); }
(function () {
if (0) {
function t() { console.log('2'); }
}
t();
}());
//error
'use strict';
if (1) function t() {}
//error
常量
const a ;
//error
const a=1;
a=2;
//error
const t={x:1}
t.y=2
console.log(t)
// {x:1,y:2}
t={z:3}
//error
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。