作用域是指程序源代码中定义变量的区域
    作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限
    作用域分为静态作用域和动态作用域,而静态作用域也称为词法作用域,javascript采用的是词法作用域
    作用域判别机制:
    词法作用域:函数的作用域基于函数定义时的作用域
    动态作用域:函数的作用域基于函数调用时的作用域
    通过一个简单的示例进行分析:

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

    根据以上代码,词法作用域的原理是调用baz函数时,执行了bar,bar中没有局部变量foo,所以去上一层作用域查找,而它的上一层作用域为全局作用域,此时的foo = 1,所以打印出1。
    动态作用域的执行原理是,调用baz,baz中又调用了bar,此时bar在baz中调用,作用域为baz,bar中没有局部变量foo,所以往上一层作用域中查找,它的上一层作用域在baz中,所以foo=2。

    思考两段代码

    1. var scope = 'global'
    2. function foo() {
    3. var scope = 'local'
    4. function bar() {
    5. console.info(scope)
    6. }
    7. return bar()
    8. foo() // 'local'
    9. var scope = 'global'
    10. function foo() {
    11. var scope = 'local'
    12. function bar() {
    13. console.info(scope)
    14. }
    15. return bar;
    16. }
    17. foo()() // 'local'

    两个函数定义的位置都是同一位置。所以作用域相同。但是这两个函数有什么不同之处呢?

    :::info 本资料内容引用自冴羽大神的博客:传送门 :::