JavaScript面试之预编译与执行

本文探讨了JavaScript的执行顺序及变量提升现象,通过具体示例展示了预编译阶段如何处理变量声明与函数声明,解释了为何某些情况下变量会显示为undefined。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天面试笔试部分有很多题是考预编译和执行的内容,为了进一步了解,在这写篇博文。

题目

if (a) {
         var a = 10;
}
console.log('a:' + a); // undefined

if (b in window) {
         var b = 10;
}
console.log( b); // 10
function fn() {
       console.log('hello');
}
fn(); // hello
var fn= function() {
       console.log('hello world');
}
fn(); // hello world
var fn = function() {
       console.log('hello world');
}
fn(); // hello world
function fn() {
       console.log('hello');
}
hello(); // hello world

以最后一个题目作为例子

  1. 扫描var关键字,提前到最顶端:
    var fn;
  2. 扫描function定义式,提到var之后:
    var fn;
    function fn(){
    console.log('hello');
    }
  3. 顺序执行代码:如下:
    var fn;
    function fn() {
    console.log(‘hello’);
    }
    fn= function(){
    console.log(‘hello world’);
    }
    fn(); // hello world
    fn();// hello world

JavaScript执行顺序

js引擎读取一段js代码,首先预解析,就是逐行读取js代码,寻找全局变量和全局函数,遇到全局变量,把变量的值变为undefind,存在内存中,
遇到全局函数,直接存在内存中,这个过程如果发现语法错误,预解析终止。
我们平时遇到这种情况:
alert(a)
var a=100
这个弹出undefind,而不是没有这个变量的语法错误,就是因为预解析时候把a调成了undefind存在内存中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值