了解做用域

什么是做用域

做用域是指程序源代码中定义变量的区域bash

做用域规定了如何查找变量,也就是肯定当前执行代码对变量的访问权限函数

一言蔽之,“做用域就是一套规则,用于肯定在何处以及如何查找变量(标识符) 的规则” 因而:spa

var a = 'programmer'

    function foo() {
        var b = 'iceman'

        console.log(a); // programmer
        console.log(b); // iceman
        console.log(c); // c is not defined
    }

    foo()
复制代码

如上代码,在函数 foo 内,输出了三个变量,那么这三个变量都是从哪来的呢。code

而所谓的做用域,在此时就体现出来了,我要在 foo 获取某个 变量(标识符),我要怎么获取指定的变量,怎么获取cdn

咱们须要知道的是,做用域分为 函数做用域和全局做用域 (后面还会有块级做用局、模块做用域);blog

上面的代码中能够这样解读:ip

a: 输出变量 a => 查找变量 a => 未在 foo 函数做用域中找到 => 去上一级做用域中寻找 => 找到 a => 输出 a => 'programmer'作用域

b: 输出变量 b => 查找变量 b =>foo 函数做用域中找到 b => 输出 b => 'iceman'string

c: 输出变量 c => 查找变量 c => 未在 foo 函数做用域中找到 => 去上一级做用域中寻找 => 未找到 c => 搜变全局也未找到变量 c => 抛出错误 => c is not definedit

综上所述,这就是 名为 做用域 的查找 规则 咱们在查找 a 的时候就已经发现,如今 foo 函数做用域中查找,没有找到,又去上一层做用域中查找,直至找到全局做用域,就好像是顺着一条链条从下往上查找,这条链条,咱们就称之为做用域链

暂且知道 做用域 && 做用域链,至于它到底是什么,以及怎么产生的,咱们后续讨论

做用域嵌套

在 ES6 以前, JavaScript 中只存在函数做用域和全局做用域;

全局做用域: 程序代码最大的做用域,只有一个,这个做用域就能够想象成一个海洋,或者 root 函数做用域: 又称局部做用域,局部做用域 顾名思义,小范围的,在程序代码中可存在多个

所谓的做用域嵌套 就体现出来了,全局做用域嵌套局部做用局,而局部做用域里面还能够继续嵌套局部做用域,就像一个洋葱卷

aa

静态做用域 && 动态做用域

词法做用域:函数的做用域在定义 声明的时候就决定了 动态做用域:函数的做用域是在函数调用的时候才决定的

var value = 1

    function foo() {
        console.log(value);
    }

    function bar() {
        var value = 2
        foo()
    }

    bar() // 输出 1
复制代码

如上:foo 做用域内没有定义 value 在它所定义的上级做用域里定义了一个 value,在 bar 环境内调用 foo,因为 JavaScript 采用的是词法做用域,也就是在定义时就肯定了 做用域,因此 foo 会获取到 它的所定义位置的上一层做用域中的 value 而不是 bar 中的 value

而动态做用域就会与词法做用域相反,采用动态做用域的语言不多,若是是动态做用域,函数的做用域是由调用的时候肯定的,就会输出 bar 内的 value

相关文章
相关标签/搜索