前端切图仔跑路真经

news/2024/12/5 3:45:07/

一、闭包

谈到闭包,我们首先要讨论的就是作用域。

1、作用域: 是指程序源代码中代码定义的范围。规定了如何设置变量,也就是确定了当前执行代码对变量的访问权限。

JavaScript采用词法作用域,也就是静态作用域,就是在函数定义的时候,就已经确定了。
在这里插入图片描述

2、变量对象
变量对象就是当前代码段中,所有的变量(包括变量、函数、形参argument)组成的一个对象。
变量对象是在执行上下文中被激活的,只有变量对象被激活了,在这段代码中才能使用所有的变量。
变量对象分为全局变量对象、局部变量对象。全局也叫VO,函数由于执行才被激活为AO。
在这里插入图片描述
3、作用域链:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4、闭包的使用:
下面代码是闭包的定义:
在这里插入图片描述
a函数执行完之后,a函数作用域断裂销毁,b函数被return,b函数还能访问到a函数,是因为b函数在生成的时候时候也保存了一份a函数变量的引用。
在这里插入图片描述
小结:闭包产生的原因必须结合作用域链进行讲解。

5、闭包的实战应用:
在这里插入图片描述
在这里插入图片描述
防抖、节流、定时器传参在这里插入图片描述
在这里插入图片描述

// 1、递归的方式实现
// 考察三个知识点:闭包、递归、全局变量
function add(n) {// 递归的出口if (!n) return res;res = nreturn function (n) {return add(res + n);};
}add(1)(2)(); // 3
console.log('add(1)(2)(): ',add(1)(2)())
add(); // 函数的调用

二、深浅拷贝深层次理解

1、下面是复制举例,并不是浅拷贝(浅拷贝也是会创建一个新的对象的):

let obj = {name: '荒天帝'
}
let obj2 = obj
obj2.name = '石昊'
console.log('obj.name',obj.name) // 石昊
console.log('obj2.name',obj2.name)// 石昊
console.log(obj === obj2) // true
console.log( {} == {}) //false

注:浅拷贝拷贝基本数据类型,是将值复制一份;如果是引用类型,那就是拷贝的地址。

2、深拷贝实现

function deepClone(source) {if (source === null) return source;if (source instanceof Date) return new Date(source);if (source instanceof RegExp) return new RegExp(source);// 递归出口if (typeof source !== "object") return source;let obj = Array.isArray(source) ? [] : {};for (let i in source) {if (source.hasOwnProperty(i)) {obj[i] = deepClone(source[i]);}}return obj;
}let person = {name: 'John',hobby: ['zhangsang', 'lisi'],date: new Date()
}
let deepPerson = deepClone(person);
deepPerson.name = '狠人大帝'
console.log('deepPerson',deepPerson)
console.log('person',person)

三、防抖节流

我是这么理解的:防抖就是回城,打断重来;节流就是技能cd

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><input type="text" id="input" /></body><script>// 防抖函数function debounce(callback, delay) {let timer;return function (arg) {clearTimeout(timer);// 我们想清除的是setTimeout,我们应该存储这个timer的变量// timer变量需要一直保存在内存当中, 内存的泄露,这就要使用闭包了timer = setTimeout(function () {callback(arg);}, delay);};}function func(value) {console.log("value", value);}const input = document.getElementById("input");const debounceFn = debounce(func, 1000);input.addEventListener("keyup", function (e) {debounceFn(e.target.value);});</script>
</html>
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><button id="button">点击</button><script>function throttle(func, wait) {let timerout;return function () {if (!timerout) {timerout = setTimeout(function () {func();timerout = null}, wait);}};}document.querySelector("#button").onclick = throttle(function () {console.log("节流 ", Math.random());}, 1000);</script></body>
</html>

五、登录验证

1、传统sessionId登录验证弊端, 解决:基于token身份认证方案
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、面试真题

function fn(a, c) {console.log("a", a); // a [Function: a]var a = 123;console.log("a", a); // a 123console.log("c", c); // c [Function: c]function a() {}if (false) {var d = 678;}console.log("d", d); // d undefinedconsole.log("b ", b); // b  undefinedvar b = function () {};console.log("b ", b); // b  [Function: b]function c() {}console.log("c ", c); // c  [Function: c]
}fn(1, 2);// 分析:
/*** 1、创建了AO对象* 2、找形参和变量的声明,作为AO对象的属性名,值是undefined,实参和形参相统一* 3、找函数声明,会覆盖变量的声明*/
AO: {a: undefined 1 function a() {}c: undefined 2 function c() {}d: undefinedb: undefined
}
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><script>// 阿里真题var name = 222;var a = {name: 111,say: function () {console.log(this.name);},};var fun = a.say;fun(); // 222a.say(); // 111var b = {name: 333,say: function (fun) {fun();},};b.say(a.say); // 222b.say = a.say;b.say(); // 333</script></body>
</html>

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

相关文章

驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID

概述 本文将介绍如何驱动和利用LSM6DS3TR-C传感器&#xff0c;实现精确的运动感应功能。LSM6DS3TR-C是一款先进的6轴惯性测量单元&#xff08;IMU&#xff09;&#xff0c;集成了三轴加速度计和三轴陀螺仪&#xff0c;可用于测量和检测设备的加速度、姿态和运动。 本文将提供L…

计算机的大小端存储模式(计算机小白必看!)

目录 1.什么是大端小端 2.为什么会有大小端模式之分呢&#xff1f; 3.如何判断当前机器为大端字节序还是小端字节序 本文将介绍计算机存储数据时的大小端问题 1.什么是大端小端 大端&#xff08;存储&#xff09;模式&#xff0c;是指数据的低位保存在内存的高地址中&…

位图布隆过滤器

位图 概念&#xff1a;就是用每一位来存放某种状态&#xff0c;适用于海量数据&#xff0c;数据无重复的场景。通常是用来判断某个数据存不存在的。 比如&#xff0c;需要在40亿个整数中&#xff0c;查看某个数是否存在&#xff1f; 1G1024M*1024KB*1024B~10亿字节~80亿比特。…

如何使用ChatGPT提升自己的“码”力?

如何使用chatGPT提升自己的"码"力? 代码评审(CodeReview)代码优化代码释义提供解决方案代码生成设计模式和架构建议学习新知识总结 ChatGPT是什么&#xff0c;我就不用再多介绍了吧&#xff01;相信大家已经看到了它在文本领域所展现出来的实力&#xff0c;虽然目前…

C++程序员换工作之后需要注意的事情,我来分享给大家

今年&#xff0c;我换了工作&#xff0c;经历了在西安找工作的过程。我想和那些有兴趣的人分享我的经验。我知道每个城市的就业市场都有自己的特点&#xff0c;所以我的经验可能不适用于其他城市。尽管如此&#xff0c;我希望分享我的经验能够帮助那些正在寻找程序员工作的人。…

【华为OD统一考试B卷 | 100分】敏感字段加密(C++ Java JavaScript Python)

题目描述 给定一个由多个命令字组成的命令字符串: 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 2、命令字之间以一个或多个下划线_进行分割; 3、可以通过两个双引号””来标识包含下划线_的命令字或空命令字(仅包含两个双引号的命令字)…

PyQt实现视频抽帧显示

文章目录 概要整体架构流程技术名词解释视频抽帧视频帧--帧的类型名词解释技术细节小结概要 PyQt实现视频抽帧显示 整体架构流程 导入必要的库。import cv2 from PyQt5.QtGui import QImage, QPixmap from PyQt5.QtCore import Qt, QTimer创建一个QTimer对象,用于循环读取视…

[CISCN2023]unzip

[CISCN2023]unzip 环境搭建 1.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><form method"post" action"1.php" en…