JavaScript 进阶三 变量作用域

作者 Marlous 日期 2018-07-12
JavaScript 进阶三 变量作用域

一 概念

  • 即变量的生命周期和作用范围。
    分为全局作用域,局部作用域。

  • 两个方面:
    当看到一个变量时,需要知道其生命周期和作用域;
    知道这个变量是在哪里定义的变量。
    两个方面

二 变量作用域解析

1 静态作用域

也称词法作用域。
由程序定义位置决定,编译时决定。与代码执行顺序无关。

例子: foo() 函数会找到全局作用域的 x 值。
例子

2 动态作用域

由程序运行时决定。

例子: 使用栈,选择最近的 x 值。
例子2

3 Js 变量作用域

Js 使用静态作用域;
Js 没有块级作用域(只有函数才会创建一个新的作用域,if,for 语句等都不会产生新的作用域);
ES5 中使用词法环境管理静态作用域。

4 词法环境

  1. 组成:环境记录(形参,变量,函数等);对外部词法环境的引用。

  2. 一段代码开始执行前,先初始化词法环境。Js 中只有全局和函数代码。

  3. 词法环境结构:
    变量顺着链一级级找。
    词法环境结构

  4. 问题:

  • 函数定义优先级高于形参,形参定义优先级高于变量定义(定义发生冲突时)。

  • 函数表达式和函数定义不同,前者的函数对象是执行到时才创建(词法环境可能会发生变化),后者的函数对象是代码执行前就定义了。
    函数表达式和函数定义

  • try…catch:
    try...catch