JS提供了4种作用域分别是: 全局作用域、局部作用域、块级作用域、脚本作用域
作用域翻译为: scope
作用域: 可以理解为起作用的范围
全局作用域
用 var 在脚本中声明的变量会自动存储在全局对象 window 里
这里我们打印一下window
可以看到刚刚声明的a变量确实存储在window对象里
局部作用域
局部作用域: 函数在运行时 临时生成的作用域
函数分两种状态: 普通态 激活态
例如: 我们可以这样理解 - 普通态: 买了个笔记本, 放着没开机
这里我们声明一个函数x:
这里在函数体里面声明了a和b两个变量 在函数中声明的变量, 属于局部作用域 -- 就避免了全局污染, 这里我们怎么能看到呢?
我们可以通过浏览器打断点的功能来查看(上方我在函数体里面打印了11就是为了打断点阻止执行)
所以必需通过断点技术, 让代码暂停在函数中, 才能观察到 局部作用域, 这样就可以避免全局污染了;
匿名函数
命名函数: 函数名 x
匿名函数: 函数声明时不指定名称:
用途: 快速生成一个 函数作用域。匿名函数附带 自调用语法 ;
注意事项: 必须用分号 和 上一行代码分割开, 防止歧义
下面来看一下代码:
这里声明的所有变量, 都不会造成全局污染, 也可以通过打断点的功能查看哦
作用域链
作用域链: 当多层作用域嵌套场景时, 使用1个变量, 如果自身没有, 会按照就近原则 到离得最近的上层作用域查找, 如果最终全局作用域也没有, 就会报错;
这里直接上代码:
在d函数体里面打印了x如上述所说会按照就近原则 到离得最近的上层作用域查找, 所以打印出来的结果为50
那如果把d函数体里面声明的a变量删除则会触发作用域链的机制会一层一层的往上找如果最终全局作用域也没有, 就会报错
这里我把所有函数体里面声明的变量都注释了, 则打印结果为10, 因为最终找到的就是全局作用域下声明的x
如果全局变量也注释了, 则会报错
这里就是说的x is not defined, 可以理解为, 你从来没有声明过x, 哪里都找不到, 就会报错显示哦!
今天就介绍到这里。