异步编程、闭包、原型链

4 阅读2分钟

1 异步编程:

在 JavaScript 中,异步编程用于处理那些需要花费时间才能完成的操作,比如网络请求、文件读取等,而不会阻塞程序的执行,让程序能够继续处理其他任务。

常见的异步编程方式有 回调函数、Promise、async/await 等。

回调函数 是最早的异步处理方式,但容易导致回调地狱(多层嵌套的回调函数,使得代码难以理解和维护)。

Promise 是一种更优雅的处理异步操作的方式,它有三种状态:Pending(进行中)、Fulfilled(已成功)、Rejected(已失败),并且可以通过 then 方法处理成功的结果,通过 catch 方法处理失败的情况。

async/await 是基于 Promise 实现的,它让异步代码看起来更像同步代码,提高了代码的可读性和可维护性。

示例代码(使用 Promise):

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const data = 'Some data';
      resolve(data);
    }, 2000);
  });
}
fetchData()
 .then(data => console.log(data))
 .catch(error => console.error(error));

2 闭包:

闭包是指有权访问另一个函数作用域中的变量的函数。

当一个函数在其内部定义了另一个函数,并且内部函数引用了外部函数的变量时,就形成了闭包。

闭包的作用包括实现私有变量、模拟块级作用域、实现函数柯里化等。

示例代码:

function outerFunction() {
  let count = 0;
  function innerFunction() {
    count++;
    console.log(count);
  }
  return innerFunction;
}
const closureFunction = outerFunction();
closureFunction(); 
closureFunction(); 

在上述代码中,innerFunction 就是一个闭包,它能够访问并修改 outerFunction 中的 count 变量。

3 原型链:

在 JavaScript 中,每个对象都有一个 __proto__ 属性,指向其原型对象。而原型对象本身也是一个对象,也有自己的 __proto__ 属性,这样就形成了一个链条,称为原型链。

当访问一个对象的属性或方法时,如果对象本身没有,就会沿着原型链向上查找,直到找到或者到达原型链的顶端(Object.prototype)。

通过原型链,可以实现对象之间的属性和方法共享,减少内存占用。

示例代码:

function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.sayHello = function() {
  console.log(`Hello, I'm ${this.name} and I'm ${this.age} years old.`);
}
const person1 = new Person('Alice', 25);
person1.sayHello();

在这个例子中,person1 对象通过原型链访问到了 Person.prototype 上定义的 sayHello 方法。