前端-JS
JS
闭包
-
闭包的应用:
- 实现数据的私有
-
内存泄漏
- 内存泄漏指任何对象在您不再拥有或需要它之后仍然存在
-
闭包=内层函数+引用的外层函数变量
const outer=()=>{ const a = 1 const f=()=>{ console.log(a) } f() } outer() 通常会再使用一个函数包裹住闭包结构,以起到对变量保护作用
-
外部如果想要使用闭包的变量,则需要return
function count(){ let i = 0 function fn(){ i++ console.log(`'函数被调用了${i}次'`) } return fn } const fun = count() fun() i=100 //从外部修改i无法修改,因为i是函数私有的
-
内存泄漏
以下代码谁存在内存泄漏?count变量
- result是一个全局变量,代码执行完毕不会立即销毁
- result使用fn函数
- fn用到fun函数
- fun函数里面用到count
- count被引用就不会被回收,所以一直存在
此时,闭包引起内存泄漏
function fn(){ let count = 0 function fun(){ count++ console.log(`'函数被调用了${count}次'`) } return fun } const result = fn() result() result() result()
JavaScript 实现冒泡排序
//升序
function sort(items){
for (var i = 0; i < items.length; i++) {
for (var j = 0; j < items[i].length-i; j++) {
if (items[j]>items[j]+1) {
var c=items[i]
items[j+1] = items[j]
items[j+1] = c
}
}
}
return items.toString()
}
JS 里垃圾回收机制
- JS 的垃圾回收机制是为了以防内存泄漏
- JS 中最常见的垃圾回收方式是标记清除
js 如何处理防抖和节流
- 函数防抖(debounce):当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时,如下,持续触发 scroll 事件时,并不执行handle函数,当1000毫秒内没有触发scroll事件时,才会延时触发scroll事件
function debounce(fn, wait) {
var timeout = null;
return function () {
if (timeout !== null) clearTimeout(timeout);
timeout = setTimeout(fn, wait);
}
} // 处理函数
function handle() {
console.log(Math.random());
}
window.addEventListener('scroll', debounce(handle, 1000));
//主要用于表单输入input
-
函数节流(throttle):当持续触发事件时,保证一定时间段内只调用一次事件处理函数 节流通俗解释就比如我们水龙头放水,阀门一打开,水哗哗的往下流,秉着勤俭节约的优 良传统美德,我们要把水龙头关小点,最好是如我们心意按照一定规律在某个时间间隔内 一滴一滴的往下滴 如下,持续触发 scroll 事件时,并不立即执行 handle 函数,每隔 1000 毫秒才会执行一次 handle 函数
var throttle = function (func, delay) { var prev = Date.now(); return function () { var context = this; var args = arguments; var now = Date.now(); if (now - prev >= delay) { func.apply(context, args); prev = Date.now(); } } } function handle() { console.log(Math.random()); } window.addEventListener('scroll', throttle(handle, 1000)) //主要用于表单提交
-
函数防抖:将几次操作合并为一此操作进行。原理是维护一个计时器,规定在 delay 时间后 触发函数,但是在 delay 时间内再次触发的话,就会取消之前的计时器而重新设置。这样一 来,只有最后一次操作能被触发
-
函数节流:使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数