作用域:
=> 变量(变量名/函数名) 的生效使用范围
作用域的分类
=> 全局作用域(window): 一个 html 页面打开就是一个全局作用域
=> 私有作用域: **只有函数生成私有作用域**
-> 只要你书写了一个函数, 就会生成一个私有作用域
-> 一经书写, 作用域永生不变
作用域的上下级关系
=> 书写在哪一个作用域内的函数, 就是哪一个作用域的子级作用域
提供了三个机制(熟读并背诵全文)
=> 变量定义机制
-> 定义在哪一个作用域下的变量, 就是哪一个作用域的私有变量
-> 只能在当前作用域以及后代作用域内使用
=> 变量访问机制
-> 当你需要访问某一个变量的值的时候
-> 首先在自己作用域内查找, 如果有, 直接使用, 停止查找
-> 如果没有, 自动去到父级作用域查找, 如果有直接使用, 停止查找
-> 以此类推, 直到全局作用域(window) 都没有, 那么直接报错, xxx is not defined
=> 变量赋值机制
-> 当你需要给某一个变量赋值的时候
-> 首先在自己作用域内查找, 如果有, 直接赋值, 停止查找
-> 如果没有, 那么自动去到父级作用域查找, 如果有直接赋值, 停止查找
-> 以此类推, 直到全局作用域(window) 都没有
-> 把这个变量定义为全局变量, 在进行赋值
*/
// 这段代码是在全局作用域下书写
console.log('我在全局作用域下')
// 在全局作用域下定义了一个叫做 fn1 的函数
function fn1() {
// 这里就是全局作用域下的一个 fn1 私有作用域
// 这里是在 fn1 私有作用域内书写的代码
function fn2() {
// 这里就是 fn1 私有作用域的 自己作用域
}
}
// 在全局作用域下定义了一个叫做 fn3 的函数
function fn3() {
// 这里就是全局作用域下的一个 fn3 私有作用域
}
// 例子:
// var a
// function fn1() {
// a = 100
// }
// fn1()
// function fn2() {
// // 我想在这里面使用 a 这个变量的值
// }