ECMAScript6-块级作用域

var声明提前

var声明的标识符会在编译阶段被提升到最近的作用域的开头

块级声明

 在"if(){}"块中,var声明的标识符,在if块执行完之后还可以访问,在编译阶段被提升到最近的作用域头部

console.log(a);
if(true){
console.log(a);
var a=123;
console.log(a)
}
VM145:1 undefined
VM145:3 undefined
VM145:5 123
undefined
console.log(b)
VM172:1 Uncaught ReferenceError: b is not defined
    at <anonymous>:1:13
(anonymous) @ VM172:1

let

使用let 可以声明只能在块内部能访问的变量,当代码块执行结束,就会自动销毁,在代码块外面不能访问到这个变量,也不会在编译阶段将这个变量提升到最近的作用域的头部,在编译阶段会将这个变量放到临时死区中,在被初始化的时候,从临时死区取出这个变量,在初始化之前访问临时死区中的变量会报错,即使是 typeof 关键字也会报错

typeof sukla;
if(true){
typeof sukla;
    let sukla=123;
console.log(sukla)
}
VM285:3 Uncaught ReferenceError: sukla is not defined
    at <anonymous>:3:1
(anonymous) @ VM285:3
typeof sukla
"undefined"

const

使用const定义的变量也和使用let定义的变量一样具有块级作用域,不会声明提前,在初始化之前会被放到临时死区,初始化之前使用typeof关键字报错

typeof sukla;
if(true){
typeof sukla;
const sukla='123';
console.log(sukla)
}
VM119:3 Uncaught ReferenceError: sukla is not defined
    at <anonymous>:3:8
(anonymous) @ VM119:3
typeof sukla
"undefined"

循环中的块级作用域

let

let在循环中的表现被做了特殊的定义,每次循环开始会销毁上一轮循环中的同名变量,并用上一次的同名变量的值来初始化一个同名的变量,然后继续本轮循环,在每一轮循环中的变量都是和其它轮循环中的变量是相对独立的

var funArr=[];
for(let i=0;i<10;i++){
    funArr.push(function(){console.log(i)})
}
funArr.forEach(function(fun){fun()})

VM276:3 0
VM276:3 1
VM276:3 2
VM276:3 3
VM276:3 4
VM276:3 5
VM276:3 6
VM276:3 7
VM276:3 8
VM276:3 9
undefined

const

const在循环中定义的变量也是在每次循环结束时候销毁,下次循环会使用新值初始化一个新变量,这个过程中,变量的值不能发生改变,所以用自增自减作为循环改变操作的循环会报错,用"for in"循环不会报错,因为这种循环不会改变循环过程中变量的值

var arr=[1,2,3]
undefined
for(const i=0;i<arr.length;i++){
    console.log(i)
}
VM124:2 0
VM124:1 Uncaught TypeError: Assignment to constant variable.
    at <anonymous>:1:29
(anonymous) @ VM124:1
var obj={
    name:"sukla",
    age:26
}
undefined
for(const k in obj){
    console.log(obj[k])
}
VM202:2 sukla
VM202:2 26
undefined

全局属性

var声明一个全局变量的时候,会在window对象上she'设置一个同名属性,let、const声明全局变量时候,不会在window上设置同名属性

var sukla=123
undefined
window.sukla
123
let sukla1=456
undefined
window.sukla1
undefined
const sukla2=789
undefined
window.sukla2
undefined

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值