作用域

作用域

执行上下文

console.log(a);  // undefined
var a = 100;

fn('zhangsan')  // 'zhangsan' 20
function fn(name) {
  age = 20;
  console.log(name, age);
  var age;
}
  • 范围:一段<script>或者一个函数

  • 全局:变量定义、函数声明

  • 函数:变量定义、函数声明、this、arguments

  • 注意⚠️“函数声明”和“函数表达式”的区别

fn()
function fn() {
  //声明
}

fn1()
var fn1 = function () {
  //表示
}
var a = 100; //类似于这个

//全局声明

console.log(a);
var a = 100;

fn('zhangsan')
function fn(name) {
  console.log(this);
  age = 20;
  console.log(name,age);
  var age;

  bar(100);

  function bar(num) {
    console.log(num);
  }
}

作用域

  • 没有块级作用域

  • 只有函数和全局作用域

如何理解作用域

  • 自由变量

  • 作用域链,即自由变量的查找

  • 闭包的两个场景

  • 生命周期

  • 作用范围

变量作用域

  • 静态作用域

  • 动态作用域

静态作用域

  • 被称为词法作用域

  • 由程序定义位置决定

全局作用域

x

10

foo

bar

foo作用域

-

-

bar作用域

x

20

动态作用域

  • 程序运行时刻

  • 栈操作

x:20

bar:

foo:

JS变量作用域

  • JS使用静态作用域

  • JS没有块级作用域(全局作用域、函数作用域)(ES5)

  • ES5中使用词法环境管理静态作用域

  • 环境记录

    • 形式参数

    • 函数声明

    • 变量

  • 对外部词法环境的引用(outer)

  • 初始化

  • 执行

作用域链

对变量提升的理解

  • 变量定义

  • 函数声明(注意和函数表达式的区别)

创建10个<a>标签 点击的时候弹出来对应的序号

  • 错误写法

  • 正确写法

最后更新于

这有帮助吗?