什么是作用域
1.什么是作用域?
什么是作用域,作用域 (scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。
作用域,也称为静态作用域。是变量存在的范围,或者说是变量搜索的范围。
作用域是静态的,因为一旦声明完成,作用域就不会改变(除了 eval)。
在运行时,js 通过作用域链搜索变量,从声明它的作用域开始。
2.如何使用?
当引擎运行时,编译器结果帮助引擎查询变量。
代码编译通常包括词法分析、语法分析(AST)和可执行代码的生成。
有两种引擎查询,
一个是 LHS 查询。主要查询赋值运算符左侧的变量,等待赋值,其中函数参数是不可见的LHS查询;
另一个是 RHS 查询。主要是查询和获取变量的值。
差异:
RHS 查询失败,直接抛出 ReferenceError
在 LHS 非严格模式下,全局变量是自动创建的;在严格模式下,会引发 ReferenceError 异常。
3.作用域的嵌套
搜索嵌套作用域的规则是,引擎从声明它的作用域开始搜索,如果找不到,它会请求下一个更高的作用域,直到到达全局作用域。
如果找不到,引擎会抛出异常 ReferenceError。
下图是一个嵌套的范围。
1是全局范围,包含标识符 demo;
2是 demo 创建的作用域,包含标识符 a,b,demochild
3是 demochild 创建的作用域,包含标识符 c;
4.词法作用域
词汇范围也是词汇阶段的范围。由编写代码时的位置决定。大体不变。
无论在哪里或者如何调用一个函数,它的词法范围只由函数声明的位置决定。
词法范围只能找到一级标识符,比如 a,b,c。
词法作用域只能找到 a,其余可以通过对象属性访问规则访问。
5.函数作用域
函数作用域是定义函数的作用域,而不是调用函数的作用域。
RHS 查询从当前范围(定义它的范围)开始。
函数作用域中属于该函数的所有标识符(变量、函数)都可以在函数作用域内使用和重用。但是不能在函数之外使用。
隐藏内部实现
根据函数作用域的规定,可以将一些代码包装在一个声明的函数中,使外部无法访问,从而达到“隐藏”代码的目的。
必要性:
根据软件设计的最小授权(最小暴露)原则,部分代码隐藏在功能范围内,不影响功能和实现。
但是,代码可以私有化,而不会暴露太多变量或函数。
而且可以避免重名的冲突。
注意:为了避免全局变量的污染和冲突,自定义插件是第三方库。最好定义自己的名称空间,并将所有变量和方法挂载到一个对象上。
比如 jquery 。(单例模式)
缺点:
1)需要声明一个函数,这可能会污染全局范围。
2)需要调用声明的函数
6.块作用域
(1)try/cacth
try/catch 的 catch 分句中具有块作用域
(2)let
将变量绑定到块作用域,不能变量提升
(3)const
const 也是块作用域变量,但是不可更改
参考文档:https://www.cnblogs.com/lyraLee/p/11428325.html
友情链接:https://www.ccwisdom.com/industrynews/