这里主要记录在平常中对知识的学习,经过结合笔记与自身理解的方式尝试写下总结
文章对细节可能不会一一介绍解释,内容仅做参考
复制代码
做用域指程序源代码中定义变量的区域,规定了如何查找变量即肯定当前执行代码对变量的访问权限bash
JavaScript采用的是词法做用域,也就是函数的做用域在函数定义的时候就决定了
与词法做用域相反的是动态做用域,也就是函数的做用域是在函数调用的时候才决定,这里仅供了解就好函数
在JavaScript中主要有全局做用域、函数做用域、块级做用域(ES6以前没有)三个学习
做用域是一个很抽象的概念,能够理解成一个地盘,具备spa
内层做用域(子做用域)能够访问外层做用域(父做用域)的变量,反之则不行。在查找一个变量时,若是在本做用域内无定义,那么就会往上一层父做用域查找,一层一层向上直到全局做用域,这种方式就成为了做用域链code
再强调一次:做用域是在相应代码定义时就被建立(例如定义函数时决定相对应的函数做用域)ip
举个栗子加深一下理解:作用域
function foo() {
var b = 2
function bar(c) {
var d = 3
console.log(a, b, c, d)
}
bar(b * 3)
}
function hkk() {
var e = 4
console.log(a, e)
}
var a = 1
复制代码
假设走到这段代码的时候,最外层做用域是全局做用域,目前的做用域层级为it
[全局做用域]
复制代码
定义foo函数,会有一个foo做用域产生io
[全局做用域[foo做用域]]
复制代码
而后走进foo里面,定义bar函数,会有一个bar做用域产生console
[全局做用域 [foo做用域 [ bar做用域 ] ] ]
复制代码
绕出来后,还定义了hkk函数,会有一个hkk做用域产生
[全局做用域 [foo做用域 [ bar做用域 ], hkk做用域]]
复制代码
在接下来变量的查找就会依赖这个做用域链 好比说在上面代码会有
在函数执行时变量的查找就会变成这样:
function foo() {
var b = 2
function bar(c) {
var d = 3
console.log(a, b, c, d)
// a: 在bar这里找不到,去foo那里找找。foo也找不到呢,再上去全局找找。在全局找到了 -> 最后得出这个值要在全局做用域下拿到
// b: 在bar这里找不到,去foo那里找找。在foo找到了 -> 最后得出这个值要在foo做用域下拿到
// c: 在bar这里找到了 -> 最后得出这个值要在bar做用域下拿到
// d: 在bar这里找到了 -> 最后得出这个值要在bar做用域下拿到
}
bar(b * 3)
}
function hkk() {
var e = 4
console.log(a, e)
// a: 在hkk这里找不到,上去全局找找。在全局找到了 -> 最后得出这个值要在全局做用域下拿到
// c: 在hkk这里找到了 -> 最后得出这个值要在hkk做用域下拿到
}
var a = 1
复制代码
做用域是执行上下文知识的前置知识
能够想象成: 我要办一座学校(全局),会有多个年级(函数/块级做用域),而后呢每一个年级里面又有多个班级(子函数/块级做用域),每一个班级又会有跟细的组织结构
可是呢 我这里只是想好了怎么安排制度(某个班级考试时,若是班级本身没有试卷,那须要的试卷应该向对应的年级拿,年级没有,再去找学校要),但至于运行起来后,年级有多少试卷,是否还有做业,就要看年级私底下的安排了(这个这里先不去理解 看看就好)