2024年面试---JS-闭包经典使用场景和含闭包必刷题(1),前端面试题2024答案

文末

逆水行舟不进则退,所以大家要有危机意识。

同样是干到35岁,普通人写业务代码划水,榜样们深度学习拓宽视野晋升管理。

这也是为什么大家都说35岁是程序员的门槛,很多人迈不过去,其实各行各业都是这样都会有个坎,公司永远都缺的高级人才,只用这样才能在大风大浪过后,依然闪耀不被公司淘汰不被社会淘汰。

为了帮助大家更好温习重点知识、更高效的准备面试,特别整理了《前端工程师核心知识笔记》电子稿文件。

内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。

269页《前端大厂面试宝典》

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

前端面试题汇总

  • 函数的上级作用域在哪里创建创建的,上级作用域就是谁

var a = 10
function foo(){
console.log(a)
}

function sum() {
var a = 20
foo()
}

sum()
/* 输出
10
/
复制代码

函数 foo() 是在全局下创建的,所以 a 的上级作用域就是 window,输出就是 10

思考题

var n = 10
function fn(){
var n =20
function f() {
n++;
console.log(n)
}
f()
return f
}

var x = fn()
x()
x()
console.log(n)
/* 输出

  • 21
    22
    23
    10
    /
    复制代码

思路:fn 的返回值是什么变量 x 就是什么,这里 fn 的返回值是函数名 f 也就是 f 的堆内存地址,x() 也就是执行的是函数 f(),而不是 fn(),输出的结果显而易见

  • 关于如何查找上级作用域

参考:彻底解决 JS 变量提升的面试题

JS 堆栈内存释放

  • 堆内存:存储引用类型值,对象类型就是键值对,函数就是代码字符串。

  • 堆内存释放:将引用类型的空间地址变量赋值成 null,或没有变量占用堆内存了浏览器就会释放掉这个地址

  • 栈内存:提供代码执行的环境和存储基本类型值。

  • 栈内存释放:一般当函数执行完后函数的私有作用域就会被释放掉。

但栈内存的释放也有特殊情况:① 函数执行完,但是函数的私有作用域内有内容被栈外的变量还在使用的,栈内存就不能释放里面的基本值也就不会被释放。② 全局下的栈内存只有页面被关闭的时候才会被释放

闭包是什么

在 JS 忍者秘籍(P90)中对闭包的定义:闭包允许函数访问并操作函数外部的变量。红宝书上对于闭包的定义:闭包是指有权访问另外一个函数作用域中的变量的函数。 MDN 对闭包的定义为:闭包是指那些能够访问自由变量的函数。这里的自由变量是外部函数作用域中的变量。

概述上面的话,闭包是指有权访问另一个函数作用域中变量的函数

形成闭包的原因

内部的函数存在外部作用域的引用就会导致闭包。从上面介绍的上级作用域的概念中其实就有闭包的例子 return f就是一个表现形式。

var a = 0
function foo(){
var b =14
function fo(){
console.log(a, b)
}
fo()
}
foo()
复制代码

这里的子函数 fo 内存就存在外部作用域的引用 a, b,所以这就会产生闭包

闭包的作用

  • 保护函数的私有变量不受外部的干扰。形成不销毁的栈内存。
  • 保存,把一些函数内的值保存下来。闭包可以实现方法和属性的私有化

闭包经典使用场景

    1. return 回一个函数

var n = 10
function fn(){
var n =20
function f() {
n++;
console.log(n)
}
return f
}

var x = fn()
x() // 21
复制代码

这里的 return f, f()就是一个闭包,存在上级作用域的引用。

    1. 函数作为参数

var a = ‘林一一’
function foo(){
var a = ‘foo’
function fo(){
console.log(a)
}
return fo
}

function f§{
var a = ‘f’
p()
}
f(foo())
/* 输出

  • foo
    /
    复制代码

使用 return fo 返回回来,fo() 就是闭包,f(foo()) 执行的参数就是函数 fo,因为 fo() 中的 a 的上级作用域就是函数foo(),所以输出就是foo

    1. IIFE(自执行函数)

var n = ‘林一一’;
(function p(){
console.log(n)
})()
/* 输出

  • 林一一
    /
    复制代码

同样也是产生了闭包p(),存在 window下的引用 n

    1. 循环赋值

for(var i = 0; i<10; i++){
(function(j){
setTimeout(function(){
console.log(j)
}, 1000)

常用的JavaScript设计模式

  • 单体模式

  • 工厂模式

  • 例模式

函数

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值