# 一些有趣的题目
# Q1. 请说出以下代码的执行顺序
new Promise(res=>{
res(1)
Promise.resolve().then(()=>console.log(2))
console.log(4)
}).then(console.log)
console.log(3)
要弄懂这道题首先必须明白Promise.then回调
是异步执行。js引擎遇到第一个.then
,由于是异步的,把事件推进队列,即console.log(2)
,遇到console.log(4)
同步代码立即执行,输出4,遇到第二个.then
推进队列,即console.log(1)
,遇到console.log(3)
同步代码立即执行。同步代码执行完毕,队列里的事件先进先出
,所以答案是4321
。关于Promise.then回调
为何是异步执行请戳 (opens new window)
# Q2. 浏览器环境执行下面的代码会输出什么(谷歌)
const a = { a:1,b(){ console.log(this.a) } };
( a && a.b )()
逻辑运算符返回的是指定操作数的值
,this
发生改变指向window
,由于const
是块级作用域,变量a
不会挂载到window
上,所以输出undefined
如果改为var
定义a
,那么会输出a
这个对象
# Q3. 执行下面的代码输出什么(hosting)
fn()
var fn
function fn(){
console.log(1)
}
fn = function fn(){
console.log(2)
}
fn()
输出1,2
# Q4. 以下代码中,p.__proto__等于什么?Person.__proto__等于什么?
function Person(name) {
this.name = name
}
let p = new Person('Tom');
Person.prototype , Function.prototype
# Q4拓展
var foo = {},
F = function(){};
Object.prototype.a = 'value a';
Function.prototype.b = 'value b';
console.log(foo.a)
console.log(foo.b)
console.log(F.a)
console.log(F.b)
value a , undefined , value a , value b