作用域和闭包(防抖和节流)

作用域和闭包

1.作用域和执行环境的关系

2.立即执行函数

3.闭包【重点】

  • 要求:清楚的说出来闭包的概念,作用和优缺点

01-作用域和执行环境的关系

`标识符`:变量,函数名,形参,对象的属性名
`作用域`:标识符起作用的范围。全局作用域和局部作用域
`执行环境`:代码运行的环境。全局执行环境和局部执行环境
``:浏览器内存开辟的一个空间,用来存储执行环境。记住'先入后出'的原则
`作用域链`:规定了标识符的查找规则。'先在当前作用域内查找,找到就使用,并终止查找,没有找出就在更外层的作用域查找,如果在全局作用域都没有找到,就会报错'`js代码的执行过程【理解】`:当打开浏览器的时候,在栈中默认就会有一个全局执行环境,这个环境中保存了全局的标识符;当需要执行函数时,就会在内存中开辟一个新的空间,用来存储函数执行环境,该环境中保存了局部的标识符,这个过程就叫'入栈',当函数执行完成,就会'出栈',对应的标识符会被销毁,释放内存空间。'需要注意的是':全局的执行环境没有入栈和出栈的过程,也就是说全局的标识符会一直存储在栈中,得不到销毁,会造成内存浪费,甚至内存泄漏。

`结论`:当函数执行完成后,对应的标识符就会被销毁,而全局声明的标识符,没办法被自动销毁,会造成内存浪费。

02-立即执行函数【理解】

`概念`:不需要调用,当声明好之后,就会立即执行的函数

`语法`
(function(){})() | (function(){}())

`特点`1. 不需要调用,会立即执行
2. 立即执行函数自带作用域

`作用`:通过立即执行函数,将更多的全局标识符变成了局部的标识符,减少全局标识符的声明,一定程度上节省了内存空间;同时还可以避免因为变量名冲突造成的全局污染
'全局污染':声明了多个全局变量,有时候会产生变量名冲突的问题

`注意`:建议手动在立即执行函数的前面添加';', 否则可能会报错

03-闭包【重点】

`概念`:跨作用于访问了变量,这种现象就是闭包

`标准语法【了解】`:在父函数内部声明变量,在子函数内部访问该变量,再将子函数通过return关键词返回出去,或者将子函数挂载到全局window对象上的任意属性上即可

`作用`: 早期模块化的实现思想

`优点`1. 减少了全局标识符的声明,一定程度上节省了内存空间,同时可以避免因为变量名冲突造成的全局污染
2. 可以保证闭包内部私有标识符的安全性

`缺点`:那个挂载到全局的变量,一直得不到释放,会在一定程度上造成内存浪费

04-防抖和节流【面试题】

这两个都是和短时间内频繁多次触发同一事件相关的性能优化

`防抖`: 短时间内频繁触发同一事件时,只有最后一次生效. 例如电梯关门的效果

`案例`: 获取输入框的内容:在2s内,如果用户一直输入,就不获取,2s后,如果用户没有输入内容,再去获取输入框的内容

	'功能拆分': 设置一个延时定时器,在2s后获取输入输入的内容,如果2s内,用户输入了新的内容,就清除定时器,并重新开启一个定时器
    
    '代码实现'var timer = 0
    
    inpEle.addEventListener('input', () => {
        // 1. 清除上一个定时器
        clearTimeout(timer)
        // 开启一个新的定时器
        timer = setTimeout(function(){
            console.log('输入框的内容', inpEle.value)
        }, 2000)
    })

`节流`: 短时间内频繁触发同一个事件时,在单位时间内,只生效一次。例如lol英雄的大招

`案例`: 点击按钮,获取输入框的内容:在3s内只能获取一次输入框的内容

	'功能拆分':记录下当前的时间,当点击按钮后,记录下点击按钮时的时间;如果两次的时间间隔大于3s,就获取输入框的内容,并将当前时间保存给上一次的时间
    
    '代码实现'// 1. 记录最开始的时间
    let prevTime = +new Date()
    btn.addEventListener('click', () => {
        // 2. 获取点击按钮的时间
        let curTime = +new Date()
        // 3. 判断是否两次时间间隔超过3s
        if(curTime - prevTime > 3000) {
            console.log('输入框的内容', inpEle.value)
            // 4. 将当前时间保存给上一次的时间
            prevTime = curTime
        }
    })
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
闭包防抖节流都是 JavaScript 中常用的技术,用于解决一些常见的问题。 闭包是指函数能够访问其外部作用域中的变量,即使在函数外部,这些变量也仍然存在。闭包常用于创建私有变量和函数。例如: ``` function counter() { let count = 0; return function() { return ++count; } } const increment = counter(); console.log(increment()); // 1 console.log(increment()); // 2 ``` 防抖节流都是用于处理事件频繁触发的情况,以减少性能开销。 防抖是指在事件触发后一定时间内没有再次触发时,才执行相应的操作。例如: ``` function debounce(fn, delay) { let timer; return function() { const args = arguments; clearTimeout(timer); timer = setTimeout(() => { fn.apply(this, args); }, delay); } } function handleInput() { console.log('Input has stopped.'); } const debouncedHandleInput = debounce(handleInput, 500); document.querySelector('input').addEventListener('input', debouncedHandleInput); ``` 节流是指在一定时间间隔内,只执行一次相应的操作。例如: ``` function throttle(fn, delay) { let lastTime = 0; return function() { const currentTime = Date.now(); if (currentTime - lastTime > delay) { fn.apply(this, arguments); lastTime = currentTime; } } } function handleScroll() { console.log('Scrolling...'); } const throttledHandleScroll = throttle(handleScroll, 500); window.addEventListener('scroll', throttledHandleScroll); ``` 以上是简单的例子,实际应用中还需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值