近期面试题目 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执行。

猜你喜欢

转载自www.cnblogs.com/Bowennan/p/13377887.html