#Js篇:闭包内存溢出内存泄露事件委托事件循环拷贝作用域-作用域链

闭包

什么是闭包?

函数嵌套函数,内部函数被外部函数返回并保存下来时,就会产生闭包。

特点:可以重复利用变量,并且这个变量不会污染全局的一种机制(可以实现变量的私有化);这个变量是一只保存在内存中,不会被垃圾回收机制回收.

缺点:闭包较多的时候,会消耗内存,导致页面性能下降。

使用场景: 防抖、截流,函数嵌套函数避免全局污染的时候。

  <script>function outer() {let a = 1;function inner() {a++console.log(a);}return inner;}let fn = outer()fn() // 2</script>

内存溢出

你要求分配的内存超出了系统能给你分配的,系统不能满足,产生溢出。

内存泄露

你向系统申请内存进行使用,使用完以后不归还,结果你申请的内存自己也不能使用了,系统也不会将你申请的内存分配给其它的需要的内存。

事件冒泡

<!DOCTYPE html>
<html><head><title>event</title>
</head>
<style>#obj1 {width: 100px;height: 500px;background-color: red;}#obj2 {width: 100px;height: 100px;background-color: blue;}#obj3 {width: 100px;height: 100px;background-color: green;}
</style><body><div id="obj1">welcome<h5 id="obj2">hello</h5><h5 id="obj3">world</h5></div><script type="text/javascript">var obj1 = document.getElementById('obj1');var obj2 = document.getElementById('obj2');obj1.addEventListener('click', function () {alert('hello1');}, false); // 冒泡obj2.addEventListener('click', function (event) {event.stopPropagation() // 阻止事件冒泡到obj1alert('world2');}, false) // 冒泡</script>
</body></html>

事件委托

又叫事件代理,原理就是利用事件冒泡的机制来实现,也就说把子元素的事件绑定到父元素的身上。

如果字元素阻止了事件冒泡,那么委托也就不成立

阻止事件冒泡: event.stopPropagation

addEventListener(‘click’,函数名,true/false)

默认false—事件冒泡

true—事件捕获

优点:提高性能,减少事件的绑定

<body><ul id="my-ul"><li>1</li><li>2</li><li>3</li><li>4</li></ul><script>let ulD = document.getElementById('my-ul')ulD.addEventListener('click', (e) => {console.log('e: ', e.target.innerText);}, true)</script>

堆栈的理解

堆是动态分配内存,内存大小不一,也不会自动释放(堆是由自动的垃圾回收来负责的)

数据类型:引用类型 数组、function

栈是自动分配相对固定大小的内存空间,并由系统自动释放。

数据类型:基本数据类型 优势:读取速度快

事件循环

原型和原型链

原型 就是一个普通的对象,它是为构造函数的实例共享属性和方法。所有实例中引用的原型都是同一个对象。

<script>function Person() {this.say = function () {console.log('say')}}let p1 = new Person()let p2 = new Person()p1.say()p2.say()</script>

使用prototype可以把方法挂在原型上,内存值保存一份

 	Person.prototype.look = function () {console.log('西游记');}let p1 = new Person()let p2 = new Person()p1.look() // 西游记p2.look() // 西游记</script>

__proto__可以理解为指针,实例对象中的属性。指向了构造函数的原型(prototype)

 console.log(p1.__proto__ === Person.prototype); // true

原型链

一个实例对象在调用属性和方法的时候,会依次从实例本身__proto__、构造函数原型prototype、原型的原型上去查找

new操作符的理解

  1. 先创建一个空对象
  2. 把空对象和和构造函数通过原型链链接
  3. 把构造函数的this绑定到新的空对象身上
  4. 根据构造函数返回类型判断,如果是值类型,则返回对象,如果是引用类型,则返回这个引用类型
<script>function newFun(Fun, ...args) {// 1. 先创建一个空对象let newObj = {}// 2. 把空对象和和构造函数通过原型链链接newObj.__proto__ = Fun.prototype// 3. 把构造函数的this绑定到新的空对象身上const result = Fun.apply(newObj, args)// 4. 根据构造函数返回类型判断,如果是值类型,则返回对象,如果是引用类型,则返回这个引用类型return typeof result instanceof Object ? result : newObj}function Person(name) {this.name = name}Person.prototype.say = function () {console.log('say');}const p1 = newFun(Person, '李四')p1.say()console.log('对象', p1);// say//  Person {name: '李四'}</script>

js如何实现继承

  1. 原型链接 ----无法穿参数
  2. 借用构造函数 — 方法不能共享
  3. 组合式继承
  4. es6的class继承

js的设计原理

js引擎

运行上下文

调用栈

事件循环

回调

js中this指向问题

  1. 全局对象中this —window
  2. 全局作用域或者普通函数 —window
  3. this永远指向最后调用它的那个对象 (在不是箭头函数的情况下)
  4. new关键字改变了this的指向
  5. apply call bind可以改变this执行
  6. 箭头函数中的this,它的指向在定义时候已经确定了,箭头函数没有自己的this,要看外层是否有函数,有就是外层函数的this,没有就是window
  7. 匿名函数中this====永远指向了window,匿名函数的执行环境具有全局性,因此this指向window

setTimeout最小执行时间

setTimeout最小执行时间是4ms—html5规定的内容

setInterval最小执行时间

setInterval最小执行时间是10ms—html5规定的内容

用递归的时候有没有遇到

递归就是一个函数可以调用函数本身

----函数内部调用自己

注意:写递归必须要有return

深拷贝

就是完全拷贝一份新的对象,会在堆中开辟新的空间,拷贝的对象被修改后,原对象不受影响

  1. 扩展运算符 —只能一层
  2. JSON.parse(JSON.stringify()) — 函数不会复制
  3. 递归
let origin = {name: '张三',age: 18,sex: '男',arr: [1, 2, 3, 4],// obj2: {//   name: 123123// },say() {console.log(1111);}}function extend(origin, deep) {let obj = {}if (origin instanceof Array) {obj = []}for (let key in origin) {let value = origin[key]obj[key] = (!!deep && typeof value === 'object' && value !== null) ? extend(value, deep) : value}return obj}const copy = extend(origin, true)copy.arr.unshift(999)console.log('origin: ', origin);console.log('copy: ', copy);// {name: '张三', age: 18, sex: '男', arr: Array(5), say: ƒ}age: 18arr: (5) [999, 1, 2, 3, 4]name: "张三"say: ƒ say()sex: "男"[[Prototype]]: Object

作用域作用域链

作用域分为

  1. 全局作用域

  2. 局部作用域

  3. 函数作用域

  4. 块级作用域

    作用域链

    当在js中使用一个变量的时候,首先在js引擎会尝试在当前作用域下去寻找改变量,如果没有找到,再到它的上层作用域中去寻找,一次类型知道找到该变量或者已经到了全局作用域。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【鸿蒙HarmonyOS开发笔记】应用数据持久化之通过关系型数据库实现数据持久化

概述 关系型数据库&#xff08;Relational Database&#xff0c;RDB&#xff09;是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制&#xff0c;对外提供了一系列的增、删、改、查等接口&#xff0c;也可以直接运…

18个惊艳的可视化大屏(第28辑):房产楼盘领域

在房产楼盘领域&#xff0c;可视化的大屏可以提供以下九大价值&#xff1a; 展示楼盘信息 可视化的大屏可以用于展示楼盘的基本信息&#xff0c;包括楼盘名称、位置、户型、价格、面积等&#xff0c;帮助潜在客户快速了解楼盘的特点和优势。 展示楼盘效果图 通过大屏展示楼盘…

load函数无法正常加载CUDA扩展的问题(程序在某一行突然卡死,也不报错,也不停止运行就可以考虑这个原因)

背景&#xff1a;在服务器上跑代码的时候&#xff0c;有时候会遇到程序在某一行代码卡死(阻塞)&#xff0c;既不报错&#xff0c;也不停止运行&#xff0c;就堵在那里。 此时就可以考虑是代码在哪里碰到了load函数&#xff0c;load函数无法正常加载CUDA扩展的问题。 下面以碰到…

MFC界面美化第三篇----自绘按钮(重绘按钮)

1.前言 最近发现读者对我的mfc美化的专栏比较感兴趣&#xff0c;因此在这里进行续写&#xff0c;这里我会计划写几个连续的篇章&#xff0c;包括对MFC按钮的美化&#xff0c;菜单栏的美化&#xff0c;标题栏的美化&#xff0c;list列表的美化&#xff0c;直到最后形成一个完整…

S2-066漏洞分析与复现(CVE-2023-50164)

Foreword 自struts2官方纰漏S2-066漏洞已经有一段时间&#xff0c;期间断断续续地写&#xff0c;直到最近才完成&#xff0c;o(╥﹏╥)o。羞愧地回顾一下官方通告&#xff1a; 2023.12.9发布&#xff0c;编号CVE-2023-50164&#xff0c;主要影响版本是 2.5.0-2.5.32 以及 6.0…

[薅羊毛活动]体验AI编码和开盲盒

​​​​​​​通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒 上面是我的邀请码,直接点击 活动说明 【活动玩法一】“体验AI编码、领取AI盲盒”活动玩法 玩法简述&#xff1a;用户进入活动页面后&#xff0c;随机参与或体验活动页面中通义灵码的任一场景&#xff0c;即可获…

软件测评中心:进行科技成果鉴定测试的注意事项和好处简析

软件产品科技成果鉴定是有效评价科技成果质量和水平的方法之一&#xff0c;也是鼓励科技成果通过市场竞争等方式得到有效的评价和认可&#xff0c;可以推动科技成果的进步和转化。 一、进行科技成果鉴定测试时的注意事项&#xff1a;   1、应由具备一定资质和能力的专业机构…

VS code配置免密连接Linux服务器

1. 服务器端 1.1 安装OpensSSH sudo apt install openssh-server 1.2 开启ssh服务 使用下面的命令查看是否开启了ssh&#xff1a; service ssh status 或者 sudo systemctl status ssh 只要看到绿色高亮的active(running)就是开启了ssh 如果没有开启&#xff0c;则使用…

如何用 Rust Reqwest 写一个Web 爬虫?

用 Rust Reqwest 编写 Web 爬虫 您是否曾考虑过建立自己的 潜在业务数据库&#xff0c;用于潜在客户开发或产品价格数据&#xff0c;以便您可以毫不费力地以最便宜的价格获得产品&#xff1f;网络爬虫可以让您无需亲自执行任何手动工作即可做到这一点。Rust通过允许显式地处理错…

MD5算法:密码学中的传奇

title: MD5算法&#xff1a;密码学中的传奇 date: 2024/3/15 20:08:07 updated: 2024/3/15 20:08:07 tags: MD5起源算法原理安全分析优缺点比较技术改进示例代码应用趋势 MD5算法起源&#xff1a; MD5&#xff08;Message Digest Algorithm 5&#xff09;算法是由MIT的计算机…

【数据结构】哈希表与哈希桶

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.概念 2.哈希冲突…

Vulnhub靶机渗透:DC-7打靶记录

前言 自信自强&#xff0c;来自于不怕苦、不怕难的积淀。宝剑锋从磨砺出&#xff0c;梅花香自苦寒来&#xff1b;任何美好理想&#xff0c;都离不开筚路蓝缕、手胼足胝的艰苦奋斗&#xff01; 靶场介绍 DC-7是一个初中级的靶场&#xff0c;需要具备以下前置知识&#xff1a;…

DevEco Studio 项目创建

安装DevEco Studio后开始使用&#xff0c;双击桌面DevEco Studio 快捷方式弹出界面&#xff1a; 选择Application —> Empty Ability&#xff0c;点击Next 项目配置 Project name&#xff1a;工程的名称&#xff0c;可以自定义&#xff0c;由大小写字母、数字和下划线组成。…

『运维心得』BPC-EPM-AddIn专家看过来

目录 系统版本问题 安装顺序问题 framework问题 vstor_redis问题 dll问题 一个小彩蛋 总结 最近在搞BPC&#xff0c;安装Office所需的EPM-AddIn的过程中&#xff0c;碰到了一些奇怪的问题。 查了BPC专家提供的安装说明文档&#xff0c;文档里要么没有提到我们碰到的问题…

简介:使用TensorFlow实现python简版神经网络模型

如果你想进一步深入AI编程的魔法世界&#xff0c;那么TensorFlow和PyTorch这两个深度学习框架将是你的不二之选。它们可以帮助你构建更加复杂的神经网络模型&#xff0c;实现图像识别、语音识别等高级功能。 模型原理&#xff1a;神经网络是一种模拟人脑神经元结构的计算模型&a…

osgEarth学习笔记3-第二个Osg QT程序

原文链接 打开QT Creator&#xff0c;新建一个窗口项目。 QT版本如下&#xff1a; 修改pro文件 QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets CONFIG c11 DEFINES QT_DEPRECATED_WARNINGS SOURCES \main.cpp \mainwindow.cpp HEADERS \mainwindow…

长安链团队论文入选国际顶会Usenix Security 2024

零知识证明是区块链扩容和隐私保护的关键前沿技术&#xff0c;其天然具备完备性、可靠性和零知识性的特点&#xff0c;是提升区块链交易吞吐量与可扩展性、在验证用户身份的同时保护用户数据隐私&#xff0c;实现复杂计算不可或缺的关键技术。基于零知识证明技术实现高兼容性、…

Linux——进程信号(二)

目录 1、阻塞信号 1.1、信号其他相关常见概念 1.2、在内核中的表示 1.3、sigset_t 1.4、信号集操作函数 2、捕捉信号 2.1、内核如何捕捉信号 5.2、sigaction 1、阻塞信号 1.1、信号其他相关常见概念 实际执行信号的处理动作被称为信号递达&#xff08;Delivery&#x…

迈向容错新时代!PASQAL发布最新技术路线图

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 深度好文&#xff1a;1200字丨8分钟阅读 近日&#xff0c;法国中性原子量子计算公司PASQAL发布了最新技术路线图&#xff0c;概述了其在硬件、业务场景用例及进一…

v3-admin-vite 整合pont

需求 目前后端的Admin模板使用的是v3-admin-vite&#xff0c;需要整合pont接口&#xff0c;方便前后端统一一体化开发 安装PONT 按照官方的文档&#xff0c;将pont engine安装好&#xff0c;然后在项目根目录执行pont start。注意生成代码路径要修改一下&#xff0c;因为v3-a…