什么是作用域

javascript

什么是作用域

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 查询从当前范围(定义它的范围)开始。

什么是作用域demo

函数作用域中属于该函数的所有标识符(变量、函数)都可以在函数作用域内使用和重用。但是不能在函数之外使用。

什么是作用域

隐藏内部实现

根据函数作用域的规定,可以将一些代码包装在一个声明的函数中,使外部无法访问,从而达到“隐藏”代码的目的。

必要性:

根据软件设计的最小授权(最小暴露)原则,部分代码隐藏在功能范围内,不影响功能和实现。

但是,代码可以私有化,而不会暴露太多变量或函数。

而且可以避免重名的冲突。

注意:为了避免全局变量的污染和冲突,自定义插件是第三方库。最好定义自己的名称空间,并将所有变量和方法挂载到一个对象上。

比如 jquery 。(单例模式)

缺点:

1)需要声明一个函数,这可能会污染全局范围。

2)需要调用声明的函数

demo

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/