前端语言03|青训营笔记

58 阅读3分钟

Javascript的闭包、this、垃圾回收

闭包

闭包是指函数可以访问并使用其父级作用域中的变量。在Javascript中,闭包通常是由一个函数和其引用的外部变量组成的。闭包的存在允许Javascript开发人员实现高阶函数、函数式编程、模块化等功能。

闭包的优点

闭包有以下几个优点:

  1. 可以使变量长期保存在内存中,有利于封装和保护变量;
  2. 可以避免全局变量的污染;
  3. 可以实现私有变量和私有方法的功能。

闭包的缺点

  1. 由于闭包中的变量长期保存在内存中,可能导致内存泄漏,影响程序性能;
  2. 使用闭包可能会增加代码的复杂性,特别是在涉及多个闭包的情况下。
function outer() {
  let x = 5;
  return function inner() {
    console.log(x);
  }
}

const innerFunc = outer();
innerFunc(); // 输出 5

在上面的例子中,outer函数返回了一个内部函数inner,内部函数可以访问到outer函数作用域中的变量x。当执行innerFunc()时,inner函数可以访问到x的值。

闭包的应用非常广泛,例如可以用闭包来实现函数柯里化(currying)、延迟计算(lazy evaluation)等功能。

this

在Javascript中,this关键字用于引用当前对象。this的值取决于函数的调用方式。当函数作为对象的方法调用时,this指向该对象;当函数作为普通函数调用时,this指向全局对象(在浏览器中是window对象)。

改变this的指向

在Javascript中,可以使用apply()、call()、bind()等方法来改变函数中this的指向。其中,apply()和call()方法是直接调用函数,并传入this和参数列表;bind()方法则是返回一个新函数,其中的this被指向传入的对象。

const obj = {
  name: "Tom",
  sayHi: function() {
    console.log(`Hello, my name is ${this.name}.`);
  }
};

obj.sayHi(); // 输出 "Hello, my name is Tom."

const person = {
  name: "Jerry"
};

obj.sayHi.call(person); // 输出 "Hello, my name is Jerry."

垃圾回收

Javascript使用垃圾回收机制来自动管理内存。垃圾回收器会定期检查不再使用的变量,并释放它们占用的内存。在Javascript中,垃圾回收器会跟踪变量的引用,并从根对象(例如window对象)开始遍历,找到所有仍然被引用的变量。所有没有被引用的变量都会被垃圾回收器清理掉。

function createArray() {
  var arr = new Array(1000000); // 创建一个包含 1000000 个元素的数组
  return arr;
}

var array1 = createArray(); // 创建第一个数组
var array2 = createArray(); // 创建第二个数组
array1 = null; // 将第一个数组引用设置为 null,即不再使用它
array2 = null; // 将第二个数组引用设置为 null,即不再使用它

// 此时,由于没有任何引用指向这两个数组,它们占用的内存将被自动回收

内存泄漏

内存泄漏是指内存被占用,但又无法被垃圾回收器释放的现象。在Javascript中,常见的内存泄漏包括未清除的定时器、闭包中的变量、DOM引用等。为了避免内存泄漏,Javascript开发人员应该注意及时释放变量,并避免创建不必要的闭包和DOM引用。

function myFunction() {
  var a = 1;
  var b = 2;
  var c = a + b;
  return c;
}