Navigation
阅读进度0%
JS 核心原理:任务队列、This、作用域与原型
December 27, 2025 (1mo ago)
JavaScript
EventLoop
Prototype
关于任务队列
只需要把js 执行的过程理清楚,基本上这些题目都是小问题,几乎来说没有任何问题
原理 和执行流程

容易出错的误区和注意事项
| 误区 | 结果 |
|---|---|
| 认为只要preomis 都是异步的 | ![]() |
| then 的参数都能被传递下去 | ![]() ![]() |
| then 中return error 就能到 catch | ![]() ![]() |
| finly 接受参数 | ![]() |
| async/awit 的异步到底是怎么回事? | ![]() |
| process.nextTick(function() { console.log('3'); }) 是直接把function 加入的micro 队列去的 |
我们可以借助这样的表格来具体的分析 其中的情况![]() |
经典问题分析
async function async1() {
console.log("async1 start");
await async2();
console.log("async1 end");
}
async function async2() {
console.log("async2");
}
console.log("script start");
setTimeout(function() {
console.log("setTimeout");
}, 0);
async1();
new Promise(resolve => {
console.log("promise1");
resolve();
}).then(function() {
console.log("promise2");
});
console.log('script end')script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout分析如下
代码执行过程如下:
- 开头定义了async1和async2两个函数,但是并未执行,执行script中的代码,所以打印出script start;
- 遇到定时器Settimeout,它是一个宏任务,将其加入到宏任务队列;
- 之后执行函数async1,首先打印出async1 start;
- 遇到await,执行async2,打印出async2,并阻断后面代码的执行,将后面的代码加入到微任务队列;
- 然后跳出async1和async2,遇到Promise,打印出promise1;
- 遇到resolve,将其加入到微任务队列,然后执行后面的script代码,打印出script end;
- 之后就该执行微任务队列了,首先打印出async1 end,然后打印出promise2;
- 执行完微任务队列,就开始执行宏任务队列中的定时器,打印出setTimeout。
This问题
原理
this 只有在调用的时候才完成绑定**,运行时绑定!****;箭头函数没有this,他的this 是最近的作用域中的this, **
一般而言 关于普通函数,this 就是一句话:“谁调用指向谁”

注意事项
| func1.call(null) | ![]() |
|---|---|
| 一个非常的经典的题目 最关键的就是var x = a(5),函数a是在全局作用域调用,所以函数内部的this指向window对象。所以 this.x = 5 就相当于:window.x = 5。之后 return this,也就是说 var x = a(5) 中的x变量的值是window,这里的x将函数内部的x的值覆盖了。然后执行console.log(x.x), 也就是console.log(window.x),而window对象中没有x属性,所以会输出undefined。 2 当指向y.x时,会给全局变量中的x赋值为6,所以会打印出6。 |
![]() |
| this 绑定的优先级 区分不清 **this绑定的优先级:**new绑定 > 显式绑定 > 隐式绑定 > 默认绑定。 |
![]() |
作用域
原理
注意事项
| 经典题目 | ![]() |
|---|---|
| 经典题目 | ![]() |
原型
原理图
下面的两张图是非常重要的 图

function SuperType(){
this.property = true;
}
SuperType.prototype.getSuperValue = function(){
return this.property;
};
function SubType(){
this.subproperty = false;
}
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function (){
return this.subproperty;
};
var instance = new SubType();
console.log(instance.getSuperValue());

容易出错的误区和注意事项
var getName = function () {
console.log(4);
}
// e
function getName () {
console.log(5);
}
// 你可以这样理解
var getName;
function getName(){};
getName = function () {
console.log(4);
};













