JS系列第四弹:JS基础之作用域

一、作用域

1- 作用域简介
作用域(scope)
1- 作用域是在程序运行时代码中的某些特定部分中变量、函数和对象的可访问性。
2- 作用域就是代码的执行环境,全局作用域就是全局执行环境,局部作用域就是函数的执行环境,它们都是栈内存
	
2- 作用域的分类
作用域又分为全局作用域和局部作用域。在ES6之前,局部作用域只包含了函数作用域,ES6的到来为我们提供了 ‘块级作用域’(由一对花括号包裹),可以通过新增命令let和const来实现;
3- 全局作用域
1- 对于全局作用域在 Web 浏览器中,全局作用域被认为是 window 对象,因此所有全局变量和函数都是作为 window 对象的属性和方法创建的。
2- 在 Node环境中,全局作用域是 global 对象。
4- 局部作用域
在ES6之前,局部作用域只包含了函数作用域。

在函数中声明的变量, 只存在函数作用域中,在函数外部是无法获取的
在这里插入图片描述

5- 块级作用域
 块级作用域(由一对花括号包裹),可以通过新增命令let和const来实现;主要存在,循环,try中的作用域
 块级作用域可通过新增命令let和const声明,所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:
	1.在一个函数内部
	2.在一个代码块(由一对花括号包裹)内部
let 声明的语法与 var 的语法一致。基本上可以用 let 来代替 var 进行变量声明,但会将变量的作用域限制在当前代码块中 

块级作用域可以存在于函数内部, 循环内部,try内部。
在这里插入图片描述

特别注意:块级作用域并不影响var声明的变量
在这里插入图片描述

6- script作用域

note: script作用域资料查找自:稀土掘金,作者: 月花zzZ

​    script作用域是本篇文章的重头,它类似于块作用域,像是一个全局的块作用域,他和window同级的。script作用域和块作用域的关系就像全局作用域和函数作用域之间的关系。他们非常相似,只是一个是全局,一个是局部。同时script作用域拥有块作用域的特性,你在全局中使用到let或const定义时他才会被创建出来。所以我们可以总结出:

1.script作用域是块作用域的全局,就像全局作用域和函数作用域之间的关系。他们非常相似,只是一个是全局,一个是局部。
2.同时script作用域的特性和块作用域一样,如果内部没有let和const定义,作用域便不会被创建出来。也就是说如果整个script脚本没有任何let和const定义,那么script作用域不会被创建。
6- debugger调试时案例分析

案例一:
1- 在运行以下代码时, 第一个debugger断住时, 作用域在函数内部, 即右边scope中显示的local中。 此时,我们可以看到local中是可以取到f值的。 同时也能范文Scope中global里的b=10.
2- 而当我们跳到第二个debugger时,我们已经跳出了函数, 此时作用域只有global, 只能获取到b的值
在这里插入图片描述
在这里插入图片描述

案例二:
每次定位时,需要确认断点所在作用域。在这里插入图片描述

7- var关键字
1- var的变量提升:
	我们在全局作用域中或还是在局部作用域中,使用var关键字声明的变量,都会被提升到该作用域的最顶部,这就是我们常说的变量提升。

需要注意的是,虽然var能让变量提升了, 但是并没有执行赋值操作, 如图。 变量aa还未执行赋值语句之前已经将aa绑定到了window上。
在这里插入图片描述

8- let关键字
1- let声明和var声明用法是一样,都是定义变量,使用let声明的变量没有var那样的变量提升,let声明的变量只在当前作用域中有效
2- let 的禁止重复声明

let无法对变量进行提升
在这里插入图片描述

另, var后的变量无法let, let后的变量无法var. 因为c为window中的一个方法, 所以, 无法let c
在这里插入图片描述

9- const关键字
1- const声明指的是常量,常量就是一旦定义完就不能修改的值。
2- 还有一点需要注意的是,常量定义必须初始化值,如果不初始化值就会报错
3- const与let在作用域维度区别不同,都是块级作用域,const常量也只会在当前代码块内有效,也不能在当前作用域中重复定义相同的变量,也不存在变量提升。
4- 对于const声明的对象,不能修改指针,但是可以修改值

在这里插入图片描述

10- 暂时死区现象
暂时死区现象:
1- let和const定义变量不会被提升到作用域顶端,即便是用相对安全的typeof也会出现错误
	console.log(typeof a);let a = 10
2- 用let定义并初始化变量语句是不会执行的。此时的value还是处于在JavaScript所谓的暂时死区(temporal dead zone)简称为TDZ 中,虽然JavaScript没有明确标准TDZ,但是人们常用它描述let和const定义的变量不会提升。
所以我们可以推测出TDZ的工作原理:JavaScript引擎在扫描代码时发现变量声明时,遇到var就会将它们提升到当前作用域的顶端。
3- 遇到let或const就会将声明放到TDZ中。这机制只会在当前作用域生效。如果是不同作用域则不会生效
	console.log(typeof value)if (true) {let value = ""}

如果没有定义a, 我们typeof a时,会提示未定义, 而如果后续存在let 赋值操作, 则会出现报错, 这就是我们说的暂时死区现象
这里是引用

11- 作用域链
1- var在全局作用域声明的变量有一种行为会挂载在window对象上,它会创建一个新的全局变量作为全局对象的属性,
这种行为说不定会覆盖到window对象上的某个属性,而let const声明的变量则不会有这一行为。
(当然了,浏览器保护性的全局变量不会被覆盖成功)

2- 当赋值时不用 var ,let,const时会发生什么?
	num = 1;首先,它会尝试在当前作用域链中解析 num; 
	如果在当前作用域链中找到num作用域链,则对其进行属性进行赋值,
	如果没有找到num,则它会在全局对象(即当前作用域链的最顶层对象)中创造num属性并赋值(一般情况下可以认为是 window/global 层)。
3- 当在Javascript中使用一个变量的时候,首先Javascript引擎会尝试在当前作用域下去寻找该变量,如果没找到,再到它的上层作用域寻找,以此类推直到找到该变量或是已经到了全局作用域,如果在全局作用域里仍然找不到该变量,它就会直接报错。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值