昨天,咱们介绍了关于Javascript面试篇的基础篇。今天,让我们来看看进阶篇都有什么。
12. 闭包是什么?闭包的使用场景有哪些?
闭包 是一种特性,它使得函数能够捕获其定义时的环境(或者说保留对外部作用域变量的访问),即便该作用域已经关闭。可以说,闭包是函数与其定义时词法环境的组合体。
换句话说,闭包赋予函数访问自身作用域、外部函数作用域以及全局作用域的能力,使它能“记住”并持续访问这些作用域中的变量和参数。
function 外部函数() {
let 外部变量 = '我来自外部函数';
return 内部函数() {
console.log(外部变量); // 从外部函数作用域访问外部变量
}
}
let 我的函数 = 外部函数();
我的函数(); // 输出: 我来自外部函数
每当创建一个函数时,特别是在一个函数内部定义另一个函数时,就会产生闭包。
执行上下文是JavaScript代码执行的环境。每次函数调用时,都会创建一个独立的执行上下文并压入执行栈。一旦函数执行完成,它就会从栈中弹出。
每个执行上下文都有一个内存空间来存储其变量和函数,一旦函数从执行栈中弹出,JavaScript垃圾回收器会清理所有这些内容。
在JavaScript中,只有当没有引用指向某对象时,该对象才会被垃圾回收。
在上述例子中,即使外部函数()已完成执行,匿名执行上下文仍然保持着对外部环境变量的引用。(它能够访问外部变量并在console.log中使用)。
闭包在JavaScript中有几个重要的使用场景:
- 数据隐私与封装:闭包可用于创建私有数据并封装功能在有限的作用域内。通过在另一个函数内部定义函数,内部函数可以访问外部函数的变量,而这些变量对函数外部不可见。这使得可以创建不直接从外部访问的私有数据和方法,从而增强数据隐私和封装性。
- 状态保持:在处理异步操作和事件处理时,闭包常用于保持状态。例如,在处理异步任务时,闭包可以捕获并保留跨多个异步操作的状态变量,确保在异步任务完成时访问到正确的变量。
- 柯里化和偏函数应用:闭包便于实现函数式编程技术,如柯里化和偏函数应用。通过使用闭包捕获并记住特定参数,然后返回使用这些被捕获参数的新函数,可以实现柯里化和偏函数应用。这允许创建具有预设参数的特化函数,提供灵活性和可重用性。
- 模块模式:闭包在实现JavaScript的模块模式中至关重要。通过使用闭包创建私有变量并仅公开必要的公共方法,开发者可以创建模块化且组织良好的代码,防止对内部模块数据的非授权访问和修改。
- 回调函数:在处理回调函数时,经常使用闭包。闭包可以用来捕获并维护异步操作上下文中变量的状态,确保在回调函数被调用时能访问到正确的变量。
13. 解释JavaScript中的提升(Hoisting)概念。
JavaScript中的提升是指在编译阶段,变量和函数声明会被移动到它们所在作用域的顶部的默认行为。这意味着你可以在代码中声明之前使用变量或调用函数。
使用var声明的变量,其声明会被提升至包含它的函数或块的顶部,并初始化为默认值“undefined”。
console.log(x); // 输出: undefined
var x =

最低0.47元/天 解锁文章
16万+

被折叠的 条评论
为什么被折叠?



