点击上方“前端开发博客”关注公众号

回复“2”加入前端群

作者:九旬

来源:SegmentFault 思否社区

目的

  • 分享日常开发工作中常遇到的问题

  • 提升工作效率,编写易维护的代码

  • 了解前端技术的趋势

This

JS 关键字:指向当前环境的上下文

1. 事件中的 this

在 DOM 事件中,this指向当前的 DOM 元素对象。

在 HTML 事件(仅为 addEventListener 添加时),this 指向了接收事件的 HTML 元素

<style>#box {height: 300px;line-height: 300px;text-align: center;}
</style>
<body><div id="box">Hello World</div><script>function bluify() {console.log(this);this.style.backgroundColor = "#00CCFF";this.innerHTML =this.innerHTML === "Hello World" ? "你好,世界" : "Hello World";}box.addEventListener("click", bluify, false);</script>
</body>

2. 全局函数、匿名函数,this 指向是全局对象

  • 浏览器中指向 Window

  • Node 环境指向 Global

function func() {console.log(this); // Window or global
}
func();

3. 对象的方法调用

this 指向当前的对象

const xiaoming = {name: "小明",getName() {console.log(this.name);},
};
xiaoming.getName(); // 小明

4. 构造函数内调用,this 指向实例对象

function Person(name, sex, age) {this.name = name;this.sex = sex;this.age = age;
}
let xiaoming = new Person("小明", "男", 20);
console.log(xiaoming); // { name: '小明', sex: '男', age: 20 }

5. call/apply/bind 调用

this 指向第一个参数

const xiaoming = {name: "小明",getName() {console.log(this.name);},
};
const xiaohong = {name: "小红",
};
xiaoming.getName.call(xiaohong); // 小红

this 复制引用

原因: 用于纠正 this 指向不达预期的问题

应用场景: 比如在 setTimeout 中的函数

用法:let that = this;

普通函数 VS 箭头函数

var name = "window";
let obj = {name: "obj",outout1() {let that = this;setTimeout(function() {console.log("普通函数", that.name);}, 1000);},outout2() {setTimeout(() => {console.log("箭头函数", this.name);}, 1000);},
};
obj.outout1(); // 普通函数 obj
obj.outout2(); // 普通函数 obj

因为箭头函数的this是在定义的时候就确定的,使用它可以少写一步 this 指向,推荐使用。

定时器

  • setTimeout:规定 N 秒后执行

  • setInterval:规定 N 秒后循环执行

参数

  • 函数/字符串、字符串会触发eval()

  • 时长毫秒(ms)

  • 传入函数的参数列表

传入函数

// setTimeout / setInterval 使用
setTimeout((...args) => {let sum = args.reduce((p, c) => p + c);console.log(args, sum); //[ 1, 2, 3 ] 6},1000,1,2,3
);
// 这段代码的意思是:在 1 秒后将这个函数推入执行栈,然后传递参数1,2,3到函数中

一秒后开始计算 1,2,3 的和,然后输出。

传入字符串

setTimeout("alert(0)", 2000);

可以接受一个字符串,默认通过 eval() 解析后执行,但是 eval 函数非常耗性能,非特殊不推荐。

返回值

返回定时器的 ID ,用于清除定时器。

clearInterval(n);
clearTimeout(n);

setTimeout

核心逻辑:N 秒推入执行栈,而不是 N 秒后执行,

使用场景:延迟执行某个操作时

问题:

  • 设置 0 秒也会在下一个宏任务中执行(异步)

  • 定时器在 for 中输出 1-10 的坑(forEach 不可跳出循环)

异步

// for & setTimout
for (var i = 1; i <= 10; i++) {setTimeout(() => {console.log(i); // ??}, 1000);
}

因为异步的原因,setTimeout 被延迟到下一次事件循环中执行。

forEach

forEach 不能跳出循环

let arr = [1, 2, 3];
arr.forEach((e) => {console.log(e);1, 2, 3;e += 1;if (e === 2) {// break !X// return !X}
});
console.log(arr); // [1, 2, 3];

forEach中使用breakreturn等都不会跳出循环。

上列操作可以转换为for操作

for (let i = 0; i < arr.length; i++) {if (arr[i] === 2) {break;}arr[i] += 1;
}
console.log(arr); // [ 2, 2, 3 ]

setInterval

使用场景

  • 视频学习的定时保存学时

  • 扫码登录的轮询

问题

定时器不准确的原因

  • N 秒后推入执行栈,而不是 N 秒后执行

  • 会因为前面有代码在执行而导致时间变短

案例代码:

假设有一个 HTTP 轮询,每一秒查询一次数据。

let startTime = new Date().getTime();
let count = 0;
setInterval(() => {let i = 0;while (i++ < 10000000); // 假设这里是查询数据带来的网络延迟,用来增加每次函数执行的时间count++;console.log("与原设定的间隔时差了:",new Date().getTime() - (startTime + count * 1000),"毫秒");
}, 1000);

代码在执行多次后,定时器会变得不准确,产生误差。

定时器不及时清楚(小程序中)

  • clear的话会一直保存在内存中,造成内存泄漏。

  • 使用场景:保存学时、人脸识别、考试倒计时等

  • 多个页面栈共享定时器

解决方法

定时器不准确

解决方法:使用settimeout模拟setinterval

// 自定义一个定时器
let timer = null;
function interval(func, wait) {let interv = function() {func.call(null);timer = setTimeout(interv, wait);};timer = setTimeout(interv, wait);
}// 使用定时器
interval(() => {let date = new Date();console.log("log..", `${date.getMinutes()}: ${date.getSeconds()}`);
}, 1000);// 清楚定时器
setTimeout(() => {clearTimeout(timer);
}, 1000 * 6);

定时器太多清楚不掉,造成内存泄漏

解决方法:批量清楚定时器

// 清楚当前页面的所有定时器
for (let i = 1; i < 100000; i++) {clearInterval(i);clearTimeout(i);
}

建议及时保存定时器的id,用于清除。

推荐阅读  点击标题可跳转

Vue 项目性能优化技巧分享

工作两年前端经验分享

2021 阿里字节快手面经 & 个人成长经验分享

关注下方「前端开发博客」,回复 “加群”

加入我们一起学习,天天进步

如果觉得这篇文章还不错,来个【分享、点赞、在看】三连吧,让更多的人也看到~

   “分享、点赞、在看” 支持一波 

面向后端的前端技术分享相关推荐

  1. 好程序员web前端技术分享媒体查询

    为什么80%的码农都做不了架构师?>>>    好程序员web前端技术分享媒体查询 什么是媒体查询 媒体查询可以让我们根据设备显示器的特性(如视口宽度.屏幕比例.设备方向:横向或纵向 ...

  2. 前端技术分享之HTMLHTML5

    前端技术分享之HTML&&HTML5 HTML 发展历史 HTML文档模式 标准模式 HTML 4.01 严格型 XHTML 1.0 严格型 HTML 5 准标准模式 HTML 4.0 ...

  3. web前端技术分享:前端开发与后端开发的区别是什么?

    相信很多人在技术岗都听到过前端和后端这两个职位,但是大部分人对前端开发与后端开发的区别是什么?并不是很清楚,下面小千就为大家详细的介绍一下两者的区别之处. web前端分享:前端开发与后端开发的区别是什 ...

  4. 2019年长沙前端技术分享大会圆满成功

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文首发: 唐胡子俱乐部,授权发布! 摘要 长沙百名互联网前端程序员齐聚长沙互联网活动基地(唐胡子俱乐部). 主办单位:唐 ...

  5. Web前端技术分享:学习HTML和CSS的5大理由

    人们学习HTML和CSS最常见的原因是开始从事Web开发.但并不是只有Web开发人员才要学习HTML和CSS的核心技术.作为一个网络用户,你需要你掌握的相关技术很多,但下面小千总结了5个你无法拒绝学习 ...

  6. web前端技术分享:web前端的求职前景好不好?

    想要进军互联网行业,大部分人会选择web前端和web前端这两个技术,因为两者之间的发展前景是非常好的.下面我们就先来了解一下web前端的求职前景好不好? web前端的求职前景好不好?近几年的热门行业里 ...

  7. 前端技术分享之3/8女神节抽奖活动

    一.活动背景 作为一家团队文化氛围浓厚的公司,每年的3/8女神节活动那是必不可少的. 一般来说,这样的活动想要收到足够的效果,那高密度的人员聚集是必不可少的(比如去年就组织了大型送玫瑰花活动加现场抽奖 ...

  8. 30个前端技术分享主题

    这是我们团队前30期的前端内部技术分享主题,我做的是第1.10.19期的分享,仅供大家参考

  9. Web前端技术分享之前后端分离接口

    随着互联网的高速发展以及IT开发技术的升级,前后端分离已成为互联网项目开发的业界标准使用方式.在实际工作中,前后端的接口联调对接工作量占Web前端人员日常工作的30%-50%,甚至会更高.接下来就给大 ...

  10. Web前端技术分享:全栈工程师常用的开发工具

    全栈工程师,也叫全端工程师,是指掌握多种技能,并能利用多种技能独立完成产品的人.全栈工程师熟悉多种开发语言,同时具备前端和后台开发能力,从需求分析,原型设计到产品开发,测试,部署,发布全流程都十分熟悉 ...

最新文章

  1. zabbix web前端取值同后端取值不一致
  2. linux根分区扩容(LVM动态卷)
  3. 探测器扎堆火星,毅力号:谁挡我WiFi了!
  4. 解决ubuntu修改密码 Module is unknow报错
  5. Python编程专属骚技巧2
  6. 随机森林和GBDT的几个核心问题
  7. ClamAV学习【6】—— cli_load函数浏览
  8. 木蚂蚁软件光盘 V2.0 2008元旦贺岁版
  9. 最新2020版IDEA下载安装教程
  10. 纯CSS实现数据上报和HTML验证
  11. 使用telnet登录数据库服务器
  12. forEach空指针异常问题
  13. 两化融合资质认证流程
  14. scipy稀疏矩阵lil_array
  15. android 画图 出界,android:字符串索引出界
  16. 19朵玫瑰花的花语-教你简单玫瑰花的折法
  17. 图像特征描述子——Susan
  18. 这篇AI相关的ppt质量极高,强烈推荐
  19. 检测打印机状态(VB实现)
  20. Python,tkinter库与turtle库实现(520,情人节)小礼物

热门文章

  1. 儒略历、儒略日与儒略年原来是鸡同鸭讲
  2. POI设置导出的EXCEL锁定指定的单元格
  3. 图片过大怎么压缩?3个免费方法让图片变小
  4. 计算机中单位换算tb,计算机中容量单位B、KB、MB、GB和TB的关系
  5. mysql compute_compute by 的使用
  6. GD32串口接收发送数据总结
  7. 用艾宾浩斯曲线记忆周期来背单词是否有理论依据?
  8. Excel鼠标所在行列填充颜色
  9. Nacos——Distro一致性协议
  10. C. Balanced Stone Heaps