js教程(13)

一、作用域

        作用域规定了变量能够被访问的范围,而离开变量作用域的变量则不能被访问(有时也叫变量的生命周期)。作用域又分为局部作用域和全局作用域。

1.局部作用域

        在函数或代码块内部声明的变量只能在其内部被访问,在外部无法被访问,这里有几个注意点:

  • 函数的形式参数也是函数内部的局部变量且不同函数内部声明的同名变量之间也不能互相访问;
  • 函数执行完毕后,函数内部的变量会被释放;
  • 变量在不进行声明时为全局变量,可以在代码块内部被外部访问到;
var i = 0;
    function nihao(){
        let numm = 0;
        j = 0;
        var num = 0;
        console.log(i,num,numm,j);
        num++;
        numm++;
        i++;
        j++;
    }
    nihao();
    nihao();
    try{
        console.log("j:"+j);
        console.log("num:"+num);
    }catch(err){
        console.log(err);
        console.log("变量找不到")
    }

 

2.全局作用域

       在最外层声明的变量就是全局作用域,这里有两个注意点:

  • 为window对象动态添加的属性默认也是全局的;
  • 函数中未使用任何关键字声明的变量为全局变量(本质上时给window对象添加了属性);

3.作用域链

        作用域链本质上是底层的变量查找机制,浏览器变量查找机制如下:

  • 在函数被执行时,会优先查找当前函数作用域中查找变量;
  • 如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域;
    function first(){
        let num = 1;
        function second(){
            let num = 2;
            function three(){
                console.log("three:"+num);
            }
            three();
            console.log("second:"+num);
        }
        second();
        console.log("first:"+num);
    }
    first();
    console.log(num);
    var num = 0;
    console.log(num);

这里如果不用var声明最外层的num则会报错,但声明之后则不会报错,但值变为了underfined,这种情况叫变量提升,下面我们会讲到这种情况。

4.JS垃圾回收机制 

JavaScript中的垃圾回收机制是自动进行的,也就是说开发者无需手动管理内存。垃圾回收的目的是检测和释放不再使用的内存,以便其他变量可以使用。下面是一些JS中常用的垃圾回收技术:

  1. 标记清除:垃圾回收器首先会标记所有的变量,然后从根变量开始遍历所有可访问的变量,并将其标记为“存活”。然后,垃圾回收器会遍历内存,清除未标记的变量。

  2. 引用计数:每个变量都有一个引用计数,表示有多少个引用指向它。当一个变量的引用数变为0时,说明它不再被使用,垃圾回收器会回收该变量的内存。

  3. 分代回收:根据变量的生命周期将其分为不同的代,通常是新生代和老生代。垃圾回收器会更频繁地检查新生代,因为这些变量的生命周期较短,而对老生代的检查则较少。这样可以减少垃圾回收的开销。

需要注意的是,垃圾回收器并不是实时执行的,而是在一些触发条件下才会执行,比如当内存达到一定限制时或者浏览器空闲时。这是为了避免影响JavaScript程序的性能。同时,开发者也可以手动触发垃圾回收,使用gc()方法可以执行垃圾回收,这里就不进行展开了。

5.闭包操作

JavaScript的闭包是指函数能够记住并访问其词法作用域,即使该函数在其词法作用域外执行。简单来说,闭包就是函数和其词法环境的组合。

当一个函数内部定义了另一个函数,并且内部函数引用了外部函数的变量时,就会产生闭包。这样的闭包能够使变量的值在外部函数执行完后仍然保持。

闭包的特性有以下几点:

  1. 内部函数可以访问外部函数的变量,即使外部函数已经执行完毕。
  2. 闭包函数会拷贝外部函数的变量副本,而不是引用,这样即使外部函数的变量改变,闭包中的变量值也不会受到影响。
  3. 闭包可以让变量长期驻留在内存中。

闭包在实际开发中的应用非常广泛,例如:

  • 封装私有变量:使用闭包可以创建私有变量,并通过返回函数的方式暴露出一些对外的接口,隐藏内部的实现细节。
  • 延迟执行:通过使用闭包,可以实现函数的延迟执行,比如在定时器或事件回调中使用闭包,可以保持对外部变量的引用。
  • 模块化开发:使用闭包可以创建模块化的代码结构,避免全局变量的污染

需要注意的是,闭包会引用外部函数的变量,导致外部函数的变量不能被正常释放,可能导致内存泄漏问题。因此,在使用闭包时需要注意避免循环引用以及合理释放资源。

function outer() {
  var outerVar = 'I am outer';
  
  function inner() {
    console.log(outerVar);
  }
  
  return inner;
}

var closure = outer();
closure(); // 输出: I am outer
 

6.变量提升

        变量提升是JS中比较奇怪的现象,它允许在变量声明之前即被访问,但仅存在于var中,正因如此,es6中出现了let和const来声明变量,这两个关键字不会产生变量提升,变量提升的现象就和上述代码一样,先访问后声明,变量的值为underfined。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/610009.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows下安装最新的nginx

1、进入官网下载地址 https://nginx.org/en/download.html#/ 2、点击这里最新的版本下载 3、(不要直接运行解压的nginx.exe),应这样操作WindowsR,输入CMD, 4、查看一下自己解压后的位置,我的是在E盘 5、输入对应的W…

金和OAC6 FileDownLoad 任意文件读取漏洞

文章目录 免责声明漏洞描述漏洞原理影响版本漏洞复现修复建议 免责声明 没有网络安全就没有国家安全,该文章只为学习和交流,利用做违法乱纪的事,与本人无关 漏洞描述 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,…

【dnSpy】通过IL指令添加try catch语句

原始代码 我们需要将整体代码添加try catch语句 步骤 添加代码的保护区域,也就是{ } 获取Exception.Message方法 添加callvirt指令 添加提示框 添加call指令 最后让消息框显示 编译完点击确定即可 添加后的IL指令代码详解 如果看不清楚联系作者 参考文档 ht…

支付漏洞防护绕过的一种方式

首先注册一个账户并进行登陆,点击一个商品点击进去 这里为了方便查看数据包,我这边商品的数量选择3,点击立即购买并抓包 观察数据包,发现有个num传参,正是我选择的数量3,尝试修改为负数-3,这里需要修改两个包 点击提交后发现报错了,显示已经付了或者金额不能为0 也就是说数量…

WebStorm开发插件

WebStorm开发插件 开发 WebStorm 插件是一项令人兴奋的任务,它可以帮助提升开发效率,定制 IDE 来满足个人或团队的需求。在这份指南中,我将向你介绍如何开始开发 WebStorm 插件,并提供一些实用的技巧和建议。 1. 准备工作 在开…

文心一言 VS 讯飞星火 VS chatgpt (256)-- 算法导论18.3 2题

二、请写出 B-TREE-DELETE 的伪代码。如果要写代码,请用go语言。 文心一言: 首先,我会提供 B-Tree 删除操作的伪代码,然后我会给出使用 Go 语言实现的简化版本。请注意,一个完整的 B-Tree 实现会涉及很多细节和边界情…

FPGA采集卡,可实现CVBS/HDMI/SDI三种信号转换

可实现CVBS/HDMI/SDI三种信号转换, 客户应用:电视台,舞台,会议室 主要性能: 1:标准CVBS信号输入,标准HDMI信号输入,标准SDI信号输入,输入信号自适应. 2:3G/HD/SDSDI信号输出可选 2:1080P/10801/720P/4801/5761常用分辩率可选 1080PSF/720P30/…

安防监控/视频汇聚系统EasyCVR+AI智能分析助力解决校园霸凌事件

一、方案背景 校园霸凌这一校园中不应存在的现象,却屡见不鲜,它像一把锋利的刀,深深地刺入那些无辜的心灵,让受害者承受着无尽的痛苦。随着科技的进步与发展,我们应该追求有效、进步的手段来阻止校园霸凌事件的发生&a…

【WEEK11】 【DAY4】员工管理系统第五部分【中文版】

2024.5.9 Thursday 接上文【WEEK11】 【DAY3】员工管理系统第四部分【中文版】 目录 10.6.增加员工10.6.1.修改list.html10.6.2.修改EmployeeController.java10.6.3.新建add.html10.6.4.重启并运行 10.6.增加员工 10.6.1.修改list.html 第53行&#xff0c;把<h2>Sectio…

揭秘金融行业:资本的流转与价值的创造

金融行业&#xff0c;这个庞大而复杂的经济体系&#xff0c;如同现代社会的血脉&#xff0c;支撑着全球经济的运行与繁荣。它不仅关乎金钱的流通&#xff0c;更是涵盖了资金的管理、分配、增值、保护以及一系列与之相关的专业服务。今天&#xff0c;就让我们一起深入探索这个充…

【intro】Graph Isomorphism Network(GIN)

论文 https://arxiv.org/pdf/1810.00826 abstract 图神经网络(gnn)是一种有效的图表示学习框架。gnn采用邻域聚合方案&#xff0c;通过递归聚合和变换相邻节点的表示向量来计算节点的表示向量。已经提出了许多GNN变体&#xff0c;并在节点和图分类任务上取得了最先进的结果。…

Linux内存管理——Swap

swap space 一个磁盘区域&#xff0c;作为内存使用。当系统内存不足时&#xff0c;会将一些很久不使用的数据转移到swap space中。 优点&#xff1a;扩展了内存空间 缺点&#xff1a;用磁盘做内存&#xff0c;读写效率降低。 swappiness swappiness的值表示建议swap space替…

DDOS攻击实战演示,一次DDOS的成本有多低?

DDoS攻击成本概览 分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其低廉的启动成本和惊人的破坏力著称。攻击者通过黑市轻松获取服务&#xff0c;成本从几十元人民币的小额支出到针对大型目标的数千乃至数万元不等。为了具体理解这一成本结构&#xff0c;我们将通过一个简…

『先进技术助力』Kompas AI:智能AI代理在工作中的应用与效率提升

『智能化未来』Kompas AI如何改变我们的工作方式&#xff1f; 在这个信息时代&#xff0c;利用AI聊天机器人来处理机械性的工作已经成为一种趋势。ChatGPT作为一种智能助手&#xff0c;不仅能够提高工作效率&#xff0c;还可以帮助我们更明智地做出决策&#xff0c;从而释放出更…

“黑灯工厂“都是科技和狠活,其中可视化大屏就是火眼金睛。

夜幕降临,一座伸手不见五指的工厂,却传来了金属板与机床“咔哒咔哒”的按压声。暗色中,只有设备状态指示灯、品质检验灯以及自动行进的AGV小车激光发射器在泛着微光,整个上万平方米的生产车间都处于“黑灯”状态…… “黑灯工厂”是指在生产过程中几乎不需要人工操作的工厂。 …

【JVM】JVM规范作用及其核心

目录 认识JVM规范的作用 JVM规范定义的主要内容 认识JVM规范的作用 Java 虚拟机规范为不同的硬件平台提供了一种编译Java技术代码的规范。 Java虚拟机认得不是源文件&#xff0c;认得是编译过后的class文件&#xff0c;它是对这个class文件做要求、起作用的&#xff0c;而并…

【JavaEE 初阶(四)】多线程进阶

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多线程知识 目录 1.前言2.常见的锁策略2.1悲观锁vs乐观锁2.2轻量级锁vs重量级锁2.3自旋锁vs挂起锁2.4读写…

LLM-AI大模型介绍

大语言模型 (LLM) 背景 &#x1f379;大语言模型 (Large Language Model) 是一种人工智能模型, 它们通常包含数千亿甚至更多的参数&#xff0c;并在大规模数据集上进行训练。大语言模型可以处理多种自然语言任务&#xff0c;如文本分类、问答、翻译、对话等等。 自然语言模型…

axios异步操作第一篇

1 同步请求和异步请求 客户端给java后台程序发送请求&#xff0c;发送请求的方式有两种&#xff1a; 同步请求 同步请求发送方式&#xff1a; 1 浏览器地址栏&#xff0c;输入url&#xff1a;http://localhost:8080/web-app/xxxServlet 2 3 删除 4 javascript:location.hr…

记录Postgresql 报错 the database system is in recovery mode

在开发环境中&#xff0c;突然有一天来到公司启动项目的时候报错 看到这个报错肯定是数据库出啥问题了&#xff0c;我们的数据库是部署在docker里面的。 远程服务器之后&#xff0c;使用命令查看容器&#xff0c;发现数据库容器还是启动着的 docker ps 那就进去容器内部看看…