提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
1.宏任务和微任务
console.log(1);
async function async1(){
await async2();
console.log(2);
}
async function async2(){
console.log(3);
}
async1()
setTimeout(()=>{
console.log(4);
},0)
new Promise(resolve =>{
console.log(5)
resolve()
}).then(()=>{
console.log(6);
}).then(()=>{
console.log(7);
})
console.log(8);
最后输入是13582674,这里需要注意的一点是同步先执行,异步后执行然后微任务先执行,宏任务再执行 ,比较重要的一点是promise里面和await的算同步(await后面的返回值相当于接的then)
函数引用和变量引用
var a =1;
(function a(){
a = 2
console.log(a)
})()
这里输出的是function a,因为如果引用是同一个名称得函数和变量,那么变量和函数就是需要比较,而函数引用是比变量引用大。
作用域和作用域链
var a =2
if(true){
console.log(a)
let a = 2;
console.log(a);
}
这个题很经典,因为会报错,因为当执行第一个console得时候由于作用域链,先在块级作用域当中执行,那么找到了下面得a,由于没有预先申明,生成了暂时性死区。
同样是作用域链
var x = 10
function f(){
console.log(x);
}
function show(f) {
var x = 20
f()
}
show(f) // 10
//
作用域在函数定义时就已确定,show(f) 里执行f(),f()先在自己作用域里查找x,没有再往外层作用域也就是全局作用域查找。
// 可以跨块及作用域
if(true)
{
var a =2
}
function fn(){
console.log(a)
}
fn()
var name = 10;
function fn(){
console.log(this.name)
}
obj = {
name:2,
getB:function (){
fn()
}
}
obj.getB()
上面返回的值是10,这个是因为fn是在getB里面但是fn()并没有被调用,引用的意思是需要有前缀obj.fn(),这样就是被调用,没有被调用就指向全局