浅聊一下JavaScript中的作用域机制
前言
如何了解作用域?首先我们需要明白什么是域。
域是一个广泛的概念,它在不同的领域有不同的含义。在数学中,域是一个代数结构,它包含了加法和乘法,并满足一些特定的性质,比如加法和乘法的封闭性、结合律、交换律、单位元素和逆元素的存在等。
在计算机科学中,域通常指的是一个特定的领域或范围,比如在互联网上,一个域名(Domain Name)就是用来标识一个或一组网络资源的名称。另外,在数据库中,域指的是一个属性或字段的集合,它定义了该字段的取值范围和约束条件。
在其他领域,域可能指的是一个特定的知识领域或活动领域,比如物理学中的电磁场领域,或者商业领域中的市场域等等。总的来说,域可以指代一个范围、领域或区域,在该范围内有特定的规则、属性或特征。
JavaScript的作用域是指在代码中定义变量的区域,决定了变量在代码中的可见性和可访问性。今天我们来介绍一下JS中的全局作用域,函数作用域与块级作用域
正文
首先浏览器引擎需要对我们的代码进行词法分析
当我们在编译器中输入var a = 2
这一行代码时,浏览器会分析出这行代码中有哪些词法单元。在这行代码中,词法单元有var,a,=,2
在完成词法分析后就会对我们的代码进行解析
解析就是将词法单元转换成一个逐级嵌套的程序语法结构树
最后一步便是生成代码:var a = 2
-
什么是全局作用域
我们先看两段代码
function foo(a){
console.log (a+b);
}
var b = 2
foo(1)
我们可以看见这段代码运行结果为3
function foo(a){
console.log (a+b);
}
function bar(){
var b = 2
}
bar()
foo(1)
我们重新申明bar这个函数,在其中申明b=2,这时运行代码却显示报错这是为什么呢?
这两份代码有什么区别呢?
我们在第一个代码中将b申明在全局,而第二份我们申明在第二个函数体内
我们需要先了解什么是有效标识符:在一个函数内声明的变量或者函数自己内的参数就是这个函数体的有效标识符,即在一个空间中有意义的东西。
位于全部作用域内,在JavaScript中,全局作用域是指在代码中任何地方都可以访问的范围。在浏览器环境中,全局作用域通常是指window
对象,在Node.js环境中则是指global
对象。
- 函数作用域
- 内层作用域可以访问外层作用域,反之则不行
function foo() {
var a = 1
}
foo()
console.log(a);
a在foo()的作用域内,而全局作用域在foo作用域的外层,因此全局查找不到a,所以打印不出来
这时我们把a提出来,在全局申明一下,我们在打印一下看看
var a = 1
function foo() {
console.log(a);
}
foo()
因为它在全局中,而内层作用域可以访问外层作用域,因此能打印出来a的值
- 块级作用域 { let }
let VS var
1.var存在申明提升,let不存在
2.let会和{}形成块级作用域
3.var可以重复申明变量,let不可以
总结
在JavaScript中,作用域是理解该语言核心概念之一。通过了解作用域的原理,我们可以更好地组织和管理代码,避免变量冲突和意外行为的发生。无论是全局作用域还是函数作用域,它们都为我们提供了灵活性和可控性,让我们能够编写更加清晰、健壮的代码。
在编写JavaScript代码时,牢记作用域的重要性,合理地使用全局变量和局部变量,以及避免变量污染和意外的副作用,将有助于提高代码的可维护性和可读性。作用域不仅是一种语言特性,更是一种编程哲学,它引导着我们编写高质量、可靠的JavaScript代码。
在接下来的编程旅程中,让我们继续深入学习JavaScript的各种概念和技术,不断提升自己的编程能力,创造出更加优秀的应用和项目!
转载自:https://juejin.cn/post/7365879319598645260