返回

JS疑难杂症之闭包真的“闭”吗?

前端

JS疑难杂症之闭包真的“闭”吗?

#

前言

近日,看到了这样一个笔试题目,题目如下:

问: 如何在不改变上述代码的情况下,修改obj对象

看到这里,你脑海里是不是嗡嗡的呀!!!

引发的思考

考察点

对于这些考察点的理解可自行查阅资料,这里就简单的概括一下:

1. 作用域 :作用域是决定变量有效范围的区域,在JS中,作用域有两种,全局作用域和局部作用域。全局作用域是指在整个脚本中都可以访问的变量,而局部作用域是指在函数内部可以访问的变量。

2. 闭包 :闭包是指函数内部可以访问其外部作用域的变量,即使该函数已被执行并返回。闭包可以用来实现一些非常强大的功能,比如实现私有变量、模拟对象等。

3. 内存泄漏 :内存泄漏是指由于程序疏忽而造成内存资源无法被释放的情况,导致内存空间被不断占用,最终可能导致系统崩溃。

4. 事件循环 :事件循环是指JS运行时从线程队列中获取事件并执行的循环过程,JS是一门单线程语言,所有的任务都必须在同一个线程中顺序执行。

解决方案

var obj = {
  name: 'Jack',
  age: 20
};

function changeObj() {
  obj.name = 'Lily';
  obj.age = 25;
}

changeObj();

console.log(obj); // { name: 'Lily', age: 25 }

解释:

在上述代码中,changeObj()函数被执行时,创建了一个新的作用域,但是它可以访问obj对象,因为obj对象是在changeObj()函数的外部作用域中声明的。当changeObj()函数修改obj对象时,这些修改将在全局作用域中可见。

扩展阅读

闭包的应用

闭包在JS中有着广泛的应用,这里列举一些常见的应用场景:

1. 私有变量 :闭包可以用来实现私有变量,即在函数内部声明的变量只能在该函数内部访问。

2. 模拟对象 :闭包可以用来模拟对象,即创建一个具有属性和方法的对象,这些属性和方法只能在该闭包内部访问。

3. 事件处理 :闭包可以用来实现事件处理,即当某个事件发生时,执行相应的代码。

4. 异步编程 :闭包可以用来实现异步编程,即在某个操作完成后,执行相应的代码。

闭包的注意事项

在使用闭包时,需要考虑以下注意事项:

1. 内存泄漏 :闭包可能会导致内存泄漏,因为闭包中的变量会一直保存在内存中,即使该闭包不再被需要。

2. 性能问题 :闭包可能会导致性能问题,因为闭包中的变量会一直保存在内存中,这可能会占用大量的内存空间并减慢代码的执行速度。

3. 可读性问题 :闭包可能会导致代码的可读性问题,因为闭包中的变量可能会被其他代码所修改,这可能会导致代码难以理解和维护。

总结

闭包是JS中一个非常重要的概念,它可以用来实现一些非常强大的功能。但是,在使用闭包时,也需要考虑闭包可能会导致的内存泄漏、性能问题和可读性问题。

#

#