web学习笔记(十九)

news/2025/1/31 0:09:57/

目录

1.作用域

1.1作用域的概念

1.2作用域的分类

1.2.1全局作用域

1.2.2局部作用域

1.2.3块级作用域(ES6新增  )

2.变量作用域

2.1全局变量

2.2局部变量

3.作用域链 

3.1作用域链的定义

4.垃圾回收机制

4.1定义

4.2如何避免内存泄漏

5.预解析


1.作用域

1.1作用域的概念

我们平时声明的变量的名字,并不是在所有地方都有效,限定这个名字的可用范围,就是这个名字所在的作用域。作用域的使用可以提高程序逻辑的局部性,增强了程序的可靠性,同时可以减少命名冲突的问题。

1.2作用域的分类

作用域分为全局作用域、局部作用域和块级作用域(es6新增)三种。

1.2.1全局作用域

在全局范围(script标签内部,或者独立的js文件)内都生效(函数内和外都可以访问到)。

1.2.2局部作用域

也叫函数作用域,只有函数内才能访问到

1.2.3块级作用域(ES6新增  )

  •  { }表示一个块级作用域,一个循环或者一个条件语句都是一个块级作用域。
  • ES6才有块级作用域,之前都是没有的。
  • 在其他编程语言中(如java、c#等),或在es6中,let声明的变量只在它所在的代码块有效,所以在外部是访问不到的。

2.变量作用域

2.1全局变量

  1. 在全局作用域下声明的变量叫全局变量(在函数外部定义的变量)
  2.  函数内外都能使用
  3. 声明周期比较长,只有页面关闭才销毁
  4. 如果函数内,没有声明变量,直接使用,也会将这个变量升级为全局变量 eg:  a=10;

2.2局部变量

  1. 在函数内声明的变量是局部变量。
  2. 局部变量只能在函数内使用。
  3. 生命周期短,函数一旦被调用,变量就销毁,及时释放内存。
  4. 函数形参部分,也是局部变量。
  5. 如果在函数内部用var声明一个变量,那么这个变量也是局部变量。
  6. 局部变量只在函数内部进行使用。

3.作用域链 

3.1作用域链的定义

       作用域链就是变量可用范围的一种查找机制,函数套函数,每个函数都有自己的作用域,首先先从当前作用域中查找,如果查不到,则向上层作用域查找,直到找到全局,找到了就可以使用,找不到就报错,这种链式查找关系,就叫作用域链(其实就是一层一层向上查找作用域,看看能不能找到所用变量的定义信息,要是都找不到,那就得报错)。

比较官方的解释:根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为作用域链。

function f1() {var num = 123;function f2() {var num = 0;console.log(num); // 站在目标出发,一层一层的往外查找}f2();}var num = 456;f1();

4.垃圾回收机制

4.1定义

       当已经不需要某块内存时,但这块内存还未能释放出来这就叫内存泄漏,而垃圾回收机制就是为了防止内存泄漏,所以不定时的寻找到不再使用的变量,并将这些内存释放出来。

4.2如何避免内存泄漏

  1. 尽量减少使用全局变量,多使用局部变量。
  2. 在代码中多使用函数封装。
  3. 移除被遗忘的定时器或回调函数
  4. 及时释放闭包中的变量。
  5. DOM的引用时 不再使用的DOM要及时清除。
  6. 数组和对象在使用完时要置空。

5.预解析

JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行JavaScript代码的 时候分为两步:预解析和代码执行。

  • 预解析: "var function”声明的两个变量在内存中 进行提前声明或者定义(其实就是变量或函数提升)。
  • 代码执行:从上到下执行JS语句。
            // 源程序var a = 18;f1();function f1() {var b = 9;console.log(a);console.log(b);var a = '123';}// ----------------// 按照预处理解析过的程序var a;//函数和var声明都要提前function f1() {// 函数内部的声明也要提前var a;var b;b = 9;console.log(a); //undefinedconsole.log(b); //9         a = '123';}a = 18;f1();
       // 源程序f1();console.log(c);console.log(b);console.log(a);function f1() {var a = b = c = 9;//var a;// a = b = c = 9;// 相当于 var  a  = 9; b = 9; c = 9; b 和 c 直接赋值 没有var 声明 当 全局变量看// 集体声明  var a = 9, b = 9, c = 9;console.log(a);console.log(b);console.log(c);}// ----------------// 按照预处理解析过的程序function f1() {var a;a= b = c = 9;console.log(a);//9console.log(b);//9console.log(c);//9}f1();console.log(c);//9console.log(b);//9console.log(a);//报错


http://www.ppmy.cn/news/1345596.html

相关文章

C语言探索:选择排序的实现与解读

当我们需要对一组数据进行排序时,选择排序(Selection Sort)是一种简单但效率较低的排序算法。它的基本思想是每次从未排序的数据中选择最小(或最大)的元素,然后将其放置在已排序序列的末尾。通过重复这个过…

零代码3D可视化快速开发平台

老子云平台 老子云3D可视化快速开发平台,集云压缩、云烘焙、云存储云展示于一体,使3D模型资源自动输出至移动端PC端、Web端,能在多设备、全平台进行展示和交互,是全球领先、自主可控的自动化3D云引擎。此技术已经在全球申请了专利…

python介绍,安装Cpython解释器,IDE工具pycharm的使用

python介绍 官方的Python解释器本质是基于C语言开发的一个软件,该软件的功能就是读取以py.结尾的文件内容,然后按照Guido定义好的语法和规则去翻译并执行相应的代码。这种C实现的解释器被称为Cpython。 python解释器的种类:Jython IPyth…

Text Mesh Pro图文混排如何对任何图片都能实现

1)Text Mesh Pro图文混排如何对任何图片都能实现 2)Unity iOS平台的小图占用特别大的内存 3)只在编辑器内,纹理不开启Read&Write情况下,如何获取纹理所有颜色值 4)准备在海外发行游戏,有哪些…

vue3+echarts:Vue中使用echarts从后端获取数据并赋值显示

//由于前后端交互,所以使用axios发送请求 const Count ref(null); //设备种类数值 const Name ref(null); //设备种类名称 //设备种类 饼图 const pieChart () > {const getpieChart echarts.init(document.getElementById("deviceKind"));// 创建图标getpieC…

【MATLAB】使用梯度提升树在回归预测任务中进行特征选择(深度学习的数据集处理)

1.梯度提升树在神经网络的应用 使用梯度提升树进行特征选择的好处在于可以得到特征的重要性分数,从而识别出对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力,减少过拟合的风险,并且可以加快模型训练和推理速度。此外&…

torch_scatter和torch_sparse用于处理图形数据和稀疏张量·「含有下載地址」

torch_scatter和torch_sparse是PyTorch的两个重要扩展库,用于处理图形数据和稀疏张量。它们通常与深度学习任务中的图神经网络(GNNs)相关联,这些网络涉及对图形结构的学习和推断。 torch_scatter库提供了一组用于对稀疏张量执行聚…

【Linux取经路】探寻shell的实现原理

文章目录 一、打印命令行提示符二、读取键盘输入的指令三、指令切割四、普通命令的执行五、内建指令执行5.1 cd指令5.2 export指令5.3 echo指令 六、结语 一、打印命令行提示符 const char* getusername() // 获取用户名 {return getenv("USER"); }const char* geth…