闭包、this、箭头函数、bind、节流一次就搞懂?这篇文章能回答你所有疑问吗?
- 工作日记
- 5小时前
- 29热度
- 0评论
闭包、this、箭头函数、bind、节流一次就搞懂?
在JavaScript开发中,闭包、this指向、箭头函数等概念如同会呼吸的空气——虽然无处不在,但很多开发者直到遇到诡异bug时才意识到它们的运作规律。本文将用最直白的语言拆解这些高频面试考点,通过快递员送货、储物柜存取等生活化比喻,带你看透这些"熟悉又陌生"的核心机制。
一、闭包:不会消失的记忆银行
1.1 闭包的本质
记住这句黄金法则:闭包 = 函数 + 它被创建时的词法环境。就像快递员永远记得你的收货地址,函数会永久携带出生时的环境变量。
function createCounter() { let count = 0 // 这个变量将被闭包"记住" return function() { return ++count } } const counter = createCounter() console.log(counter()) // 1 console.log(counter()) // 2
1.2 闭包三大陷阱
陷阱1:循环中的闭包黑洞
使用var声明时,所有迭代共享同一个变量:
// 错误示范 for(var i=0; i<3; i++){ setTimeout(() => console.log(i), 100) // 输出3次3 } // 正确解法:改用let声明
陷阱2:内存泄漏危机
闭包中的大对象要及时清理:
function processBigData() { const bigData = new Array(1000000) return () => bigData[0] // 闭包持有整个数组! }
二、this指向:会变脸的快递员
2.1 四大绑定规则
- 默认绑定:普通函数调用时,this指向window(严格模式为undefined)
- 隐式绑定:obj.method() 时,this指向调用对象
- 显式绑定:call/apply/bind 强制指定this
- new绑定:构造函数中指向新实例
2.2 箭头函数:没有自己的this
箭头函数如同透明的玻璃窗,永远继承外层this:
const obj = { name: 'obj', normalFunc: function() { console.log(this.name) // 'obj' }, arrowFunc: () => { console.log(this.name) // undefined(假设外层是window) } }
三、bind魔法:给函数戴上定位手环
bind方法如同给函数安装GPS定位,永久绑定this:
const module = { x: 42, getX: function() { return this.x } } const unboundGetX = module.getX console.log(unboundGetX()) // undefined const boundGetX = unboundGetX.bind(module) console.log(boundGetX()) // 42
四、节流函数:智能限流的闸门
利用闭包实现高频事件控制:
function throttle(fn, delay) { let lastCall = 0 return function(...args) { const now = Date.now() if(now lastCall < delay) return lastCall = now fn.apply(this, args) } } // 使用示例 window.addEventListener('resize', throttle(() => { console.log('处理resize事件') }, 200))
五、综合应用:React事件绑定解密
在React类组件中,三种典型的事件处理方式:
class MyComponent extends React.Component { // 方式1:bind绑定 constructor() { super() this.handleClick = this.handleClick.bind(this) } // 方式2:箭头函数 handleClick = () => { console.log(this.state) } // 方式3:内联箭头函数 render() { return
掌握这些核心概念后,你将能:
- 准确预测代码中的this指向
- 避免常见的内存泄漏陷阱
- 手写bind、节流等工具函数
- 深入理解框架底层机制
下次遇到闭包相关bug时,记得在Chrome DevTools的Scope面板查看闭包变量。通过刻意练习这些概念,你将在代码海洋中游刃有余,真正实现从"会用"到"懂原理"的蜕变。