常见内存泄漏及解决方案
内存泄漏(Memory Leak
)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
隐式全局变量
在局部作用域中,等函数执行完毕,变量就没有存在的必要了,浏览器的垃圾回收机制很快进行回收,但是对于全局变量,很难判断什么时候不用这些变量,无法正常回收;所以,尽量少使用全局变量。
内存泄漏(Memory Leak
)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
在局部作用域中,等函数执行完毕,变量就没有存在的必要了,浏览器的垃圾回收机制很快进行回收,但是对于全局变量,很难判断什么时候不用这些变量,无法正常回收;所以,尽量少使用全局变量。
按照惯例,所有 script 元素都应该放在页面的 head 元素中。这种做法的目的就是把所有外部文件 (css 文件和 JavaScript 文件) 的引用都放在相同的地方。可是,在文档的 head 元素中包含所有 JavaScript 文件,意味着必须等到全部 JavaScript 代码都被下载,解析和执行完成以后,才能开始呈现页面的内容 (浏览器在遇到 body 标签时才开始呈现内容)
例:将下面数组去除重复元素(以多种数据类型为例)
const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]
定义:let/const
命令会使区块形成封闭的作用域。若在声明之前使用变量,就会报错。总之,在代码块内,使用 let
命令声明变量之前,该变量都是不可用的。这在语法上,称为 “暂时性死区”
现象:
console.log(a) // ReferenceError: a is not defined
let a
如果一个函数访问了此函数的父级及父级以上的作用域变量,那么这个函数就是一个闭包。
所以以下写法都是闭包
var a = 1;
// 匿名的立即执行函数,因访问了全局变量a,所以也是一个闭包
(function test (){
alert(a);
})()
从本质上看,Object
是一个构造函数,用于创建对象。
Object
构造函数的属性在 Object
中声明的属性只有两个:
Object.length
—— 值为 1Object.prototype
—— 指向 Object
函数的原型对象静态方法就是直接定义在 Object
函数上的方法,注意与实例方法区分!!!调用的方式也不同,直接通过 Object.xxx()
的方式调用。
如果没有参数,就直接写一个空括号即可
如果只有一个参数,可以省去参数的括号
如果有多个参数,用逗号分割
如果函数体的返回值只有一句,可以省略大括号
箭头函数不会创建自己的 this, 所以它没有自己的 this,它只会在自己作用域的上一层继承 this。所以箭头函数中 this 的指向在它在定义时已经确定了,之后不会改变。
var id = 'GLOBAL';
var obj = {
id: 'OBJ',
a: function(){
console.log(this.id);
},
b: () => {
console.log(this.id);
}
};
obj.a(); // 'OBJ'
obj.b(); // 'GLOBAL'
new obj.a() // undefined
new obj.b() // Uncaught TypeError: obj.b is not a constructor
【前言】
在 JavaScript 中,for 循环语句是编写复杂程序时经常使用的一种工具。其中,for-in 和 for-of 是两个最常用的变体。尽管这两者非常相似,但它们在迭代对象方面有所不同。在本文中,我们将探讨 for-in 和 for-of 的不同之处,以及如何正确使用它们。
【正文】
for-in 循环是一种迭代对象属性的方法。它可以用于遍历对象中的所有可枚举属性,包括从原型链继承的属性。通常,我们使用 for-in 循环来遍历对象的键名。
🔥前言
前端 js 学习中,让大家最难受的就是异步的问题,解决
异步、回调地狱
等问题时你必须得学会 promise,对于多数前端程序员来说 promise 简直就是噩梦,本篇文章就是从通俗易懂的角度做为切入点,帮助大家轻松掌握 promise