在ES6之前,JS中只有两种作用域:全局和函数级别作用域。就是说你声明的变量要么可以全局访问,要么在函数内访问。当然了,函数内肯定能访问全局的变量
<script type="text/javascript">
//全局级别
var globalVar = 1;
window.globalVar2 = 2
</script>
//函数级别
(function(){
var f1 = 1;
})();
function func(){
var f2 = 2;
if(true){
var f3 = 3;
}
}
什么是块级作用域?
规范13.2.4中有这样的描述:
When a Block or CaseBlock production is evaluated a new declarative Environment Record is created and bindings for each block scoped variable, constant, function, generator function, or class declared in the block are instantiated in the Environment Record.
至于Block和CaseBlock代表什么,请参考13.2和13.12,简单理解就是{...}代表一个块级作用域,上面的描述明确说了let,const,function,generator function,class可以是块级作用域,下面看一个概述:
上面Scope是Block的表示块级作用域,图中没有写generator function,至于什么是Temporal dead zone,后面的章节中会讲。
说了这么多,还是给几个例子更能理解:
'use strict';
function blockFuncTest(){
{
blockFunc(0);
function blockFunc(idx){
console.log("blockFunc",idx);//blockFunc 0
}
}
blockFunc(1);//Uncaught ReferenceError: blockFunc is not defined
}
'use strict'
function blockLetConstTest(){
var a = 0;
const b = 0;
{
let a = 1;
const b = 1;
console.log(a,b);//1 1
}
console.log(a,b)//0 0
}
注意一定要写"use strict",没有这句话,浏览器不会按照ES6规范执行程序,class和generator function的例子有兴趣的同学自己去试试
*上面的所有代码在Chrome 47下通过测试