剑指 offer —— js闭包面试通杀秘籍

简介: 说到js闭包,早已不是什么新鲜事。几乎是前端面试时必问的一道题,到如今已是烂大街的存在,但不可否认的是,仍然有一些人没有搞懂,只知其然不知其所以然,那么我们今天就好好的捋一捋。

前言


说到js闭包,早已不是什么新鲜事。

几乎是前端面试时必问的一道题,到如今已是烂大街的存在,但不可否认的是,仍然有一些人没有搞懂,只知其然不知其所以然,那么我们今天就好好的捋一捋。

20.png


从作用域说起



说的通俗一点,作用域就是:生效的区域。比如说,我们的身份证只在国内生效,出国就得用护照了。

1. JS 局部作用域(只在当前函数生效,函数外部无法访问)

21.png

2. JS 全局作用域(在整个Script标签内生效,函数内可以访问)

22.png

3. 从浏览器底层谈本质区别

23.png

可以看到:1. a变量在Script里,这意味着就是整个script标签内都可以使用。

                 2. b变量在Local里,译为局部,只能在方法内使用。

 

一图看懂作用域链

24.png

网上有大量讲作用域链的,但是大都模棱两可、讲不清楚,直接看上图,fn3()里定义了一个变量name2,同时包含了一个方法fn4()。

最后打印出来的却不是“木子”,而是“惠子”,如果把fn4()里面的name2注释掉掉,那么打印出来的是“木子”,不会报错。

25.png

所以我们得出来的结论就是:作用域链是由函数作用域组成的一个链条。


查找规则:根据函数作用域,一级一级往上查找,如果找到了就停止,输出或执行对应操作,如果找到全局作用域都没找到,报错(就近原则)。


作用域是分层的:内层作用域可以访问外层作用域的变量,反之则不行。


闭包



以一段代码为例:


26.png

当执行到return innerBar的位置时:


根据词法作用域的规则,内部函数getName和setName总是可以访问它们的外部函数 foo中的变量。


foo函数执行完成之后,其执行上下文从栈顶弹出了,但是由于返回的setName和getName方法中使用了foo函数内部的变量myName和test1,所以这两个变量依然保存在内存中,这两个变量的集合就叫做闭包。


闭包的经典应用(面试高频题)



1. 事件防抖


27.png

2. 私有方法与私有变量

28.png


目录
相关文章
|
28天前
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包:原理与实战
【10月更文挑战第12天】深入理解JavaScript中的闭包:原理与实战
|
13天前
|
JavaScript 前端开发
js 闭包的优点和缺点
【10月更文挑战第27天】JavaScript闭包是一把双刃剑,在合理使用的情况下,它可以带来很多好处,如实现数据封装、记忆功能和模块化等;但如果不注意其缺点,如内存泄漏、变量共享和性能开销等问题,可能会导致代码出现难以调试的错误和性能问题。因此,在使用闭包时,需要谨慎权衡其优缺点,根据具体的应用场景合理地运用闭包。
103 58
|
10天前
|
JSON JavaScript 前端开发
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
本文介绍了JSONP的工作原理及其在解决跨域请求中的应用。首先解释了同源策略的概念,然后通过多个示例详细阐述了JSONP如何通过动态解释服务端返回的JavaScript脚本来实现跨域数据交互。文章还探讨了使用jQuery的`$.ajax`方法封装JSONP请求的方式,并提供了具体的代码示例。最后,通过一个更复杂的示例展示了如何处理JSON格式的响应数据。
23 2
[JS]面试官:你的简历上写着熟悉jsonp,那你说说它的底层逻辑是怎样的?
|
13天前
|
缓存 JavaScript 前端开发
js 闭包
【10月更文挑战第27天】JavaScript闭包是一种强大的特性,它可以用于实现数据隐藏、记忆和缓存等功能,但在使用时也需要注意内存泄漏和变量共享等问题,以确保代码的质量和性能。
32 7
|
15天前
|
自然语言处理 JavaScript 前端开发
JavaScript闭包:解锁编程潜能,释放你的创造力
【10月更文挑战第25天】本文深入探讨了JavaScript中的闭包,包括其基本概念、创建方法和实践应用。闭包允许函数访问其定义时的作用域链,常用于数据封装、函数柯里化和模块化编程。文章还提供了闭包的最佳实践,帮助读者更好地理解和使用这一强大特性。
11 2
|
17天前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
52 1
|
2月前
|
Web App开发 前端开发 Linux
「offer来了」浅谈前端面试中开发环境常考知识点
该文章归纳了前端开发环境中常见的面试知识点,特别是围绕Git的使用进行了详细介绍,包括Git的基本概念、常用命令以及在团队协作中的最佳实践,同时还涉及了Chrome调试工具和Linux命令行的基础操作。
「offer来了」浅谈前端面试中开发环境常考知识点
|
1月前
|
设计模式 JavaScript 前端开发
探索JavaScript中的闭包:从基础概念到实际应用
在本文中,我们将深入探讨JavaScript中的一个重要概念——闭包。闭包是一种强大的编程工具,它允许函数记住并访问其所在作用域的变量,即使该函数在其作用域之外被调用。通过详细解析闭包的定义、创建方法以及实际应用场景,本文旨在帮助读者不仅理解闭包的理论概念,还能在实际开发中灵活运用这一技巧。
|
1月前
|
缓存 JavaScript 前端开发
深入了解JavaScript的闭包:概念与应用
【10月更文挑战第8天】深入了解JavaScript的闭包:概念与应用
|
1月前
|
自然语言处理 JavaScript 前端开发
Javascript中的闭包encloure
【10月更文挑战第1天】闭包是 JavaScript 中一种重要的概念,指函数能够访问其定义时的作用域内的变量,即使该函数在其词法作用域之外执行。闭包由函数及其词法环境组成。作用域链和词法作用域是闭包的核心原理。闭包常用于数据隐藏和封装,如模块模式;在异步操作中也广泛应用,如定时器和事件处理。然而,闭包也可能导致内存泄漏和变量共享问题,需谨慎使用。