词法作用域
词法作用域(Lexical Scopes)是 javascript 中使用的作用域类型,词法作用域 也可以被叫做 静态作用域,与之相对的还有 动态作用域。那么 javascript 使用的 词法作用域 和 动态作用域 的区别是什么呢?
var value = 1;function foo() {console.log(value);//1}function bar() {var value = 2;foo();}bar();
词法作用域,就意味着函数被定义的时候,它的作用域就已经确定了,和拿到哪里执行没有关系,因此词法作用域也被称为 “静态作用域”。
块级作用域
简单来说,花括号内 {…} 的区域就是块级作用域区域。
if (true) {var a = 1;let b = 2;}console.log(a); // 1console.log(b); // b is not defined
javascript 中大部分情况下,只有两种作用域类型:全局作用域 和 函数作用域,由上边例子看得出javascript 不是原生支持块级作用域的,但是 ES6 标准提出了使用 let 和 const 代替 var 关键字,来“创建块级作用域”。
创建作用域
能够使用的创建作用域的方式就两种:定义函数创建 和 let const 创建。
在 javascript 中,我们有几种创建 / 改变作用域的手段:
定义函数,创建函数作用(推荐):
function foo () {// 创建了一个 foo 的函数作用域}
使用 let 和 const 创建块级作用域(推荐): ```javascript //let 改为var,i输出5 for (let i = 0; i < 5; i++) {
}
console.log(i); // ReferenceError
3. try catch 创建作用域(不推荐),err 仅存在于 catch 子句中:```javascripttry {undefined(); // 强制产生异常}catch (err) {console.log( err ); // TypeError: undefined is not a function}console.log( err ); // ReferenceError: `err` not found
- 使用 eval “欺骗” 词法作用域(不推荐):
- 使用 with 欺骗词法作用域(不推荐):
