lzcdev / Daily-Front-End-Questions

每日前端面试题、技巧等知识点,记录自己的成长过程
MIT License
1 stars 0 forks source link

下面代码输出什么 #9

Open lzcdev opened 5 years ago

lzcdev commented 5 years ago
var a = 10;
(function () {
    console.log(a)
    a = 5
    console.log(window.a)
    var a = 20;
    console.log(a)
})()
lzcdev commented 5 years ago

依次输出:undefined -> 10 -> 20

解析:

在立即执行函数中,var a = 20; 语句定义了一个局部变量 a,由于js的变量声明提升机制,局部变量a的声明会被提升至立即执行函数的函数体最上方,且由于这样的提升并不包括赋值,因此第一条打印语句会打印undefined,最后一条语句会打印20。

由于变量声明提升,a = 5; 这条语句执行时,局部的变量a已经声明,因此它产生的效果是对局部的变量a赋值,此时window.a 依旧是最开始赋值的10,

lzcdev commented 5 years ago

执行解析步骤: var a = undefined; a = 10; (function () { // 变量提升(预解析) var a = undefined; console.log(a); // 输出undefined a = 5; console.log(window.a); // 找window(全局)对象的a, 输出10 a = 20; console.log(a); // 输出20 })()