作用域
作用域是标识符的可访问范围
在Javascript常用三种作用域(词法环境):
- 1),全局作用域------全局定义
- 2), 函数作用域-------在函数内部定义
- 3), 块级作用域-----ES6新增的,用{}来界定块级作用域。
1,块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。
2,ES6新增了块级作用域,使用let声明的变量有块的概念,var声明的变量则没有块级作域的概念;
if(true){ var num = 100; }
console.log(num); //正常打印100
if(true){ let age = 60; }
console.log(age); //报错:age is not defined
注意
var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问。
let定义的变量, 有块的概念,不能跨块访问,也不能跨函数访问。
const用来定义常量,有块的概念,不能跨块访问,而且不能修改。
三种定义变量的常见问题(变量提升和暂存死区)
1,变量提升(var在定义变量之前进行访问变量时所引起的现象)
console.log(number); // undefined
var number = 1000;
console.log(number); // 1000
var声明的变量能够提前使用虽然只是undefined, 我们把这种现象称之为变量提升
2,暂存死区 (let在定义变量之前进行访问变量时所引起的现象)
function do_something() {
console.log(bar); // undefined
console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
var bar = 1;
let foo = 2;
}
do_something() ;
与通过 var 声明的有初始化值 undefined 的变量不同,
通过 let 声明的变量直到它们的定义被执行时才初始化。在变量初始化前访问该变量会导致 ReferenceError。该变量处在一个自块顶部到初始化处理的“暂存死区”中。
参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let
作者:糯米团子_大芒果
链接:https://www.jianshu.com/p/6b6b322b6e4d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。