作用域

132 阅读4分钟

一:全局作用域 -- 全局变量

在scripts标签中直接声明的变量,就有全局作用域:因为它在整个script标签中都可以用

二:局部作用域:也叫函数作用域 -- 局部变量

在函数内部声明的变量,在函数外部不能使用(形参相当于函数的局部变量)

三:块级作用域 -- 块级变量

块:就是指{ }

1.作用域:let变量所在的{}结构

2.有效作用域:从定义这个变量开始,到这个变量所在结构的}结束

我对于作用域的理解:

一个限制的范围(也可以是保护机制)作用域里面可以访问外面,外面不能访问里面。

我对于作用域和基本数据类型和引用数据类型之间的理解

1、在 for 循环(里面定义的i ,不管i怎么样不会,都不会影响的下一个for(里面定义的那个 i 的值))可以让我们不用定义太多的变量名。每个变量之间,互不干扰。 我们在里面怎么折腾这个变量,也不会影响到外面同名的变量

2a1a6ad256316f48d3e64340369dcde.jpg

这里我觉得是作用域问题,虽然num被当作参数传进去但是这是一个基本数据类型。相当于num的一个克隆进去参与运算,不会影响外面那个num。这里打印的是外面那个num所以结果是10

但是这样那引用数据类型呢?

我觉得引用数据类型是作用域里面的一个特例

一个基本的问题:基本数据类型和引用数据类型的赋值区别?

变量的本质就是存储地址,变量名指向这个地址,基本数据类型储存是本身,引用类型储存堆的空间地址。

那我的理解是基本数据类型赋值就是相当于搞一个克隆体咯,函数里面的值改变和外面那个值本身没有任何关系。引用类型储赋值的是地址相当于,它本身(函数里面值改变相当于改变这个值的本身,所以这个值的结果会发生改变)

c433c934ee5b2facf285eecdccb23df.png 那么按照我的理解?解释这个题目就是:

obj这个对象本身进去函数参与计算,里面temp就是obj。temp.age有就是修改没有就是添加 打印输出结果就是age=30

和那和作用域有什么关系?

我认为:作用域本身是保护局部变量的,但是这个题目里面的obj是一个全局变量。这里传参相当于一个全局变量了,不在是一个局部变量。也就是作用域的本质是用来保护局部变量的,不是用来限制全局变量的。所以引用数据类型不是特例,它是一个全局变量就无法限制,如果是在作用域里面定义就会被作用域限制 。

外面就无法正常访问到里面的类型 ,这里我就可以明白了为什么函数会有一个返回值。这个返回值就是用来就是作用域里面的计算结果的,因为当我们需要返回时候,因为作用域的问题却无法得到结果时 就需要一个东西装这个结果返回给外面。这个东西就是return

通过这样的理解我可以去理解一下,为什么需要let,匿名函数?

因为var和具名函数:在声明函数的时候为函数命名,都是一个全局函数来的,那么一个网站有这么多的var全部加到window里面就会让电脑计算机增加计算量。导致页面的加载速度增加,严重的让页面无法渲染出来

本质上是对我们使用内存进一步限制,提高程序运行效率和减少程序运行需要的时间。因为内存就这么大,如果不进行限制就很容易把内存装满了,那么就会让程序运行崩溃。