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 方法。