js教程(13)

news2025/1/12 16:09:26

一、作用域

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

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。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker部署Azure chatgpt样例应用

Github地址 https://github.com/microsoft/sample-app-aoai-chatGPT?tabreadme-ov-file#environment-variables 使用Amazon Linux 2 AMI 的arm 64版本镜像, t4g.medium实例。 需要安装git,可能需要安装 pip3等 sudo apt-get install -y python3-pip 然后从如下…

AWS Lambda 第一个例子Hello (JAVA)

什么是Serverless(无服务器计算) 行业通常所说的Serverless,主要是指“无服务器计算(Serverless Computing)”。无服务器计算,并不是真的不需要服务器,而是说,对于用户,…

200-500人规模工厂网络方案(中小企业网络)

一、方案概述 工厂一般有单独的弱电房,类似这种 里面采用的方案如下: 主要考虑有线、无线、财务、办公、访客等业务,便于维护管理和后续扩容 还需要 Wi-Fi覆盖零死角高速率,工作不卡顿 同时考虑AV反病毒、IPS入侵防御、用户准…

C语言实现扫雷游戏完整版

游戏介绍: 目录 游戏介绍: 游戏框架: 游戏具体功能实现: 棋盘的定义: 棋盘初始化: 棋盘打印: 棋盘布置雷: 棋盘扫雷: 爆炸展开一片: 获取周围八个…

HTML【安装HBuilder、常用标签】--学习JavaEE的day44

day44 JavaEE 学习过程:前端—>数据库—>服务器端 前端的VUE在框架阶段学习 JavaEE学习过程图 HTML 前端:展示页面、与用户交互 — HTML 后端:数据的交互和传递 — JavaEE/JavaWeb 1. 前端开发的工作模式 开发输出htmlcssjs 理解&am…

keil5软件安装教程(MDKv5.39)

keil5软件安装分为三部分: 目录 1.安装mdk 2.激活mdk 3.安装STM32芯片包 1.安装mdk 安装包链接:链接:https://pan.baidu.com/s/1PZoGhzI5Y19ROv7xe9QJKA?pwdgt3s 提取码:gt3s 1、下载keil5的压缩包并解压,鼠…

浅谈如何利用 AI 提高内容生产效率?|TodayAI

在数字化时代,内容的创建和分发速度变得尤为关键。人工智能(AI)技术提供了加速这一过程的可能性,不仅提升了生产效率,还改善了内容的质量和受众的接受度。本文深入探讨AI如何在内容生成、分发与推广,以及内…

Linux下GraspNet复现流程

Linux,Ubuntu中GraspNet复现流程 文章目录 Linux,Ubuntu中GraspNet复现流程1.安装cuda和cudnn2.安装pytorch3.编译graspnetAPIReference 🚀非常重要的环境配置🚀 ubuntu 20.04cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0…

如何使用openEuler 22.03 配置mail.rc给邮箱发送邮件

目录 需求环境总体步骤梳理详细步骤1. 安装mailx软件包(centos默认安装,openEuler不默认安装)2. 检查是否能ping得到smtp服务器3. 在qq邮箱开启smtp设置4. 修改/etc/mail.rc文件5. 测试 可能遇到的问题 需求 希望检查每日的备份和系统运行记…

在windows下安装wsl子系统

一、安装环境 windows规格 版本Windows 10企业版版本号22H2操作系统内部版本19045.4291 二、安装过程 2.1 以管理员身份打开PowerShell(win X快捷键); 2.2 输入命令:wsl --list --online(简写:wsl -l …

中北大学软件学院javaweb实验二JSP应用开发实验报告

实验时间 2024年4月 25 日17时至 22 时 学时数 4 1.实验名称 实验2:JSP应用开发(2学时) 2.实验目的 (1)学会编写和运行简单的JSP页面,理解其运行原理; (2)学会使用JSP的声明、表达式、脚…

【全开源】Java外卖霸王餐免费吃外卖小程序+APP+公众号+H5多端霸王餐源码

一、特色功能 霸王餐活动管理:允许商家发布和管理霸王餐活动,包括设置活动时间、具体优惠、活动规则等。用户参与与浏览:用户可以在小程序中浏览霸王餐活动列表,查看活动的详情信息,如商品或服务的免费赠送、活动规则…

MemoryModule - exp - test

文章目录 MemoryModule - exp - test概述笔记测试环境GetModuleFileName不能正常执行GetModuleFileNameWntdll_LdrGetDllFullName猜测原因用LoadLibrary载入的DLL中功能是正常的 gLog可以正常使用内存载入DLL无法支持的功能的折中方法COM操作正常调用方代码接口代码 接口入参测…

【竞技宝】欧冠:欧洲三大赛事决赛对阵出炉

本赛季欧洲三级赛事的决赛对阵均已出炉:皇马与多特蒙德相聚欧冠决赛;勒沃库森将会和亚特兰大争夺欧联杯冠军;奥林匹亚科斯则要与佛罗伦萨争夺欧协联的冠军。在6支决赛球队中,德甲和意甲都有两支球队,而西甲的皇马则是夺冠最大热门,近几个赛季战斗力极强的英超在欧战方面彻底失败…

Day 43 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

最后一块石头重量Ⅱ 有一堆石头&#xff0c;每块石头的重量都是正整数。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果如下&#xff1a; 如果 x y&#xff0c;那么两…

鸿蒙OpenHarmony技术:【Docker编译环境】

Docker环境介绍 OpenHarmony为开发者提供了两种Docker环境&#xff0c;以帮助开发者快速完成复杂的开发环境准备工作。两种Docker环境及适用场景如下&#xff1a; 独立Docker环境&#xff1a;适用于直接基于Ubuntu、Windows操作系统平台进行版本编译的场景。基于HPM的Docker环…

企业合规视角下的菜鸟网络与拼多多不正当竞争案

近日&#xff0c;浙江省高院对备受瞩目的“菜鸟网络诉拼多多不正当竞争案”做出终审判决。该案件从2022年初发酵至今&#xff0c;终于以法院驳回拼多多上诉、维持一审判决而告一段落。此案不仅在法律层面引起广泛关注&#xff0c;更在企业合规方面提供了重要的案例参考。 根据判…

ESP32引脚入门指南(五):从理论到实践(SPI)

ESP32 微控制器因其丰富的外设接口而备受赞誉&#xff0c;其中SPI&#xff08;Serial Peripheral Interface&#xff09;是一种常见的通信协议。本文将深入探讨ESP32的SPI、HSPI&#xff08;High-Speed SPI&#xff09;和VSPI&#xff08;Very High-Speed SPI&#xff09;接口&…

Qt三方库:QuaZIP介绍、编译和使用

前言 Qt使用一些压缩解压功能&#xff0c;探讨过libzip库&#xff0c;zlib库&#xff0c;libzip库比较原始&#xff0c;还有其他库&#xff0c;都比较基础&#xff0c;而在基础库之上&#xff0c;又有高级封装库&#xff0c;Qt中的QuaZIP是一个很好的选择。Quazip是一个用于压缩…

如何防止WordPress网站内容被抓取

最近在检查网站服务器的访问日志的时候&#xff0c;发现了大量来自同一个IP地址的的请求&#xff0c;用站长工具分析确认了我的网站内容确实是被他人的网站抓取了&#xff0c;我第一时间联系了对方网站的服务器提供商投诉了该网站&#xff0c;要求对方停止侵权行为&#xff0c;…