块级作用域:即在{}花括号内的域,由{ }包括,比如if{}块、for(){}块。
函数作用域:变量在声明它们的函数体以及这个函数体嵌套的任意函数体都是有定义的。
var是js的,作用域是函数作用域的,let是ES6的,作用域是块级作用域的。
// 函数作用域
function test (){
console.log('函数内var声明的:', a); // 函数内var声明的: undefined
var a = 'testa';
console.log('函数内let声明的:', b); // 报错
let b = 'testb'
}
console.log('函数外var声明的:', a); // 报错 a is not defined
test();
// 块作用域
if (true) {
let c = 'testc';
console.log('块作用域里面使用', d); // 块作用域里面使用 undefined
var d = 'testd';
}
console.log('块作用域外面使用var', d); // 块作用域外面使用var testd
console.log('块作用域外面使用let', c); // 报错
通过上述例子可见
var
定义的变量是受到函数作用域限制的,不受if{}块作用域的限制。在函数内声明前使用var变量只是打印出undefined,而在函数外使用却报错is not defined。而在if{}块作用域内声明前使用和在块内声明后块外使用,也只是打印出undefined,并不会报错let
定义的变量,是受块作用域的限制的。let定义的变量不管是在函数内声明前使用,还是函数内声明后函数外使用,及块内声明块外使用都报错is not defined