法作用域

词法作用域(Lexical Scopes)是 javascript 中使用的作用域类型,词法作用域 也可以被叫做 静态作用域,与之相对的还有 动态作用域。那么 javascript 使用的 词法作用域动态作用域 的区别是什么呢?

  1. var value = 1;
  2. function foo() {
  3. console.log(value);//1
  4. }
  5. function bar() {
  6. var value = 2;
  7. foo();
  8. }
  9. bar();

词法作用域,就意味着函数被定义的时候,它的作用域就已经确定了,和拿到哪里执行没有关系,因此词法作用域也被称为 “静态作用域”。

块级作用域

简单来说,花括号内 {…} 的区域就是块级作用域区域。

  1. if (true) {
  2. var a = 1;
  3. let b = 2;
  4. }
  5. console.log(a); // 1
  6. console.log(b); // b is not defined

javascript 中大部分情况下,只有两种作用域类型:全局作用域函数作用域,由上边例子看得出javascript 不是原生支持块级作用域的,但是 ES6 标准提出了使用 let 和 const 代替 var 关键字,来“创建块级作用域”。

创建作用域

能够使用的创建作用域的方式就两种:定义函数创建 和 let const 创建。

在 javascript 中,我们有几种创建 / 改变作用域的手段:

  1. 定义函数,创建函数作用(推荐):

    1. function foo () {
    2. // 创建了一个 foo 的函数作用域
    3. }
  2. 使用 let 和 const 创建块级作用域(推荐): ```javascript //let 改为var,i输出5 for (let i = 0; i < 5; i++) {

}

console.log(i); // ReferenceError

  1. 3. try catch 创建作用域(不推荐),err 仅存在于 catch 子句中:
  2. ```javascript
  3. try {
  4. undefined(); // 强制产生异常
  5. }
  6. catch (err) {
  7. console.log( err ); // TypeError: undefined is not a function
  8. }
  9. console.log( err ); // ReferenceError: `err` not found
  1. 使用 eval “欺骗” 词法作用域(不推荐):
  2. 使用 with 欺骗词法作用域(不推荐):