近期面试题目 js 基础
var a = 10; (funtion () { console.log(a) a = 5 console.log(window.a) var a = 20 console.log(a) })()
解答: 考点变量提升
函数内: 实际执行顺序 var a (未赋值) 所以第一个打印 undefined
然后局部作用域的a被赋值为5,接着打印window对象下的a,即 10
接着a 被重新赋值为 20
最后打印出 20
思考: 如果将 var a = 20 去掉,打印什么呢?
var a = {n: 11} var b = a; a.x = a = {n: 22} console.log(a) console.log(b)
解答:考点应用类型值的传递本质(以下 => 做指向用,并非箭头函数)
a => Object
b引用a的内容,专业术语叫做 b指向a的地址
a.x = a = {n: 22} => a.x = {n: 22}; a = {n: 22}
a在最后一步被重写(重新分配地址) 所以打印的是 {n: 22}
而b还是指向a原来的地址只是多了一个属性 x 多以打印 {n: 11, x:{n: 22}}
function wait() { return new Promise(resolve => { setTimeout(resolve, 10*1000) }) } async function main(params) { const x = wait() const y = wait() const z = wait() await x await y await z } main(); // 求这段代码运行的时长是多久,为什么?
这道题乍一看是很简单,可是往往就是个坑,至少对于我这种粗心的人是个坑了
解答: 10s
考题类型重点在于 Promise本身是同步的立即执行函数, 以及wait的调用是按照同步函数调用的,这里的await并没有起到异步作用。所以可以看作同时创建了3个宏任务 setTimeout,都是延迟10s执行。