JS执行环境与作用域理解
执行环境定义了变量或函数有权访问的其他数据,每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中.执行环境分为全局执行环境和局部执行环境,在web浏览器中,全局执行环境默认为window.当代码在环境中执行时,会创建变量对象的一个作用域链
如果用一个矩形来表示特定的执行环境.其中,内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数.每个环境都可以向上搜索作用域链,但任何环境都不能通过向下搜索作用域链而进入另一个执行环境
一个简单的例子展示changeColor函数可以访问外部的color属性,但是函数外部不能访问size属性
var color = 'red' function changeColor () { var size = 'big' color = 'yellow' } console.log(color) //yellow console.log(size) // 报错
var
命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined
。es6中新增的let和const不允许变量提升
es5中没有块级作用域, 在一个for循环中使用var声明的i,for循环结束后还是可以访问.es6中增加了let,let
实际上为 JavaScript 新增了块级作用域
for (var i = 0; i < 5; i++) { console.log(i); // 0, 1, 2, 3, 4 } console.log(i); // 5 for (let i = 0; i < 5; i++) { console.log(i); // 0, 1, 2, 3, 4 } console.log(i); // 报错