面试官最爱考的 javascript 预解析,你搞明白了吗?

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 前言面试官最爱考的javascript预解析,你搞明白了吗?javascript的es5语法和其他语言还是有些区别的,预解析正是面试爱考的重点,不妨来看看这篇博文…
<script>
    // 坑一
    console.log(num);
    var num = 10;
</script>

image.png

结果为什么会是undefined呢?先保留这个疑问,后面解答,嘿嘿嘿~~~

🍒坑二

下面这种函数定义方式,函数的调用在函数前后都可以

// 下面这种函数定义方式,函数的调用在函数前后都可以
        fn();
        function fn(){
            console.log(15);
        }
        //fn();

image.png

// 下面这种函数定义方式,函数的调用只能在函数后面
        fun();
        var fun = function(){
            console.log(15);
        }
        // fun();

image.png

这种函数定义,函数的调用放在函数前面为什么又会报错了呢,带着疑问我们看下面的解答。


🍓问题解答

要了解上面两个坑的原因,我们就要知道javascript中的预解析。


1.我们 js 引擎运行 js 分为两步:预解析和代码执行。

(1).预解析 :js 引擎会把 js 里面所有的 var 还有 function 提升到当前作用域的最前面

(2).代码执行:按照代码书写的顺序从上往下执行。


2.预解析分为变量预解析(变量提升)和函数预解析(函数提升)。

(1).变量提升就是把所有的变量声明提升到当前的作用域最前面,不提升赋值操作。

(2).函数提升就是把所有的函数声明提升到当前作用于的最前面。


看了上述,是不是对于上面的疑惑解决了,还是懵懵懂懂吗?下面我来复现一下你就明白了。

// // 坑一
        // console.log(num);
        // var num = 10;
        // 相当于执行了以下代码
        var num; // 所有的 var 提升到当前作用域的最前面,不提升赋值操作。
        console.log(num); //num此时未赋值,所以是undefined。
        num = 10;

// // 坑二
// 下面这种函数定义方式,函数的调用在函数前后都可以
        // fn();
        // function fn(){
        //     console.log(15);
        // }
        // 相当于执行下面代码
        // 函数提升到当前作用域的最前面
        function fn(){
            console.log(15);
        }
        fun();
// 下面这种函数定义方式,函数的调用只能在函数后面
        // fun();
        // var fun = function(){
        //     console.log(15);
        // }
        // 相当于执行了以下代码
        var fun;   // 所有的 var 提升到当前作用域的最前面,不提升赋值操作。
        fun(); // 此时压根没有fun()这个函数,所以会报错
        fun = function(){
            console.log(15);
        }

 // 案例一
        var num=10;
        fun();
        function fun(){
            console.log(num);
            var num = 20;
        }
        // 相当于执行了以下代码
        // var num;
        // function fun(){
        //     var num;
        //     console.log(num); //根据作用域链的就近原则,此时num未赋值,所以是undefined
        //     num = 20;
        // }
        // num = 10;
        // fun(); // 调用函数

image.png

// 案例二
        var num = 10;
        function fn(){
            console.log(num);
            var num = 20;
            console.log(num);
        }
        fn();
        // 相当于执行了以下代码
        // var num;
        // function fn(){
        //     var num;
        //     console.log(num);   //根据作用域链就近原则,此时num未赋值,所以是undefined
        //     num = 20;
        //     console.log(num);  // 根据作用域链就近原则,num是20
        // }
        // num = 10;
        // fn(); // 调用函数

image.png

// 案例三
        var a = 18;
        f1();
        function f1(){
            var b = 9;
            console.log(a);  
            console.log(b);
            var a = '123';
        }
        // // 相当于执行了以下代码
        // var a;
        // function f1() {
        //     var b;
        //     var a;
        //     b = 9;
        //     console.log(a);  //根据作用域链就近原则,此时a未赋值,所以是undefined
        //     console.log(b);  // 9
        //     a = '123';
        // }
        // a = 18;
        // f1();

image.png

 // 案例四
        f1();
        console.log(c);
        console.log(b);
        console.log(a);
        function f1(){
            var a = b = c = 9;
            // 相当于var a = 9; b = 9 ; c = 9 ; 在javascript中不用var申明直接赋值的变量是全局变量,所以b,c是全局变量
            // 区别于集体声明 var a = 9,b = 9,c = 9; 等价于var a = 9,var b = 9,var c = 9;
            console.log(a);
            console.log(b);
            console.log(c);
        }
        // // 相当于执行了以下代码
        // function f1(){
        //     var a;
        //     b = 9;
        //     c = 9;
        //     a = 9;
        //     console.log(a); // 9
        //     console.log(b); // 9
        //     console.log(c); // 9
        // }
        // f1();  // 函数调用
        // console.log(c);  // 9
        // console.log(b);  // 9
        // console.log(a);  // a是函数里的局部变量,所以函数外没有申明的话会报错

image.png

相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
2月前
|
存储 前端开发 JavaScript
JavaScript垃圾回收机制深度解析
【10月更文挑战第21】JavaScript垃圾回收机制深度解析
121 59
|
20天前
|
Java 程序员
面试官的加分题:super关键字全解析,轻松应对!
小米,29岁程序员,通过一个关于Animal和Dog类的故事,详细解析了Java中super关键字的多种用法,包括调用父类构造方法、访问父类成员变量及调用父类方法,帮助读者更好地理解和应用super,应对面试挑战。
35 3
|
1月前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
86 2
|
1月前
|
存储 NoSQL MongoDB
MongoDB面试专题33道解析
大家好,我是 V 哥。今天为大家整理了 MongoDB 面试题,涵盖 NoSQL 数据库基础、MongoDB 的核心概念、集群与分片、备份恢复、性能优化等内容。这些题目和解答不仅适合面试准备,也是日常工作中深入理解 MongoDB 的宝贵资料。希望对大家有所帮助!
|
29天前
|
JavaScript 前端开发 API
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
Vue.js响应式原理深度解析:从Vue 2到Vue 3的演进
57 0
|
1月前
|
缓存 前端开发 JavaScript
"面试通关秘籍:深度解析浏览器面试必考问题,从重绘回流到事件委托,让你一举拿下前端 Offer!"
【10月更文挑战第23天】在前端开发面试中,浏览器相关知识是必考内容。本文总结了四个常见问题:浏览器渲染机制、重绘与回流、性能优化及事件委托。通过具体示例和对比分析,帮助求职者更好地理解和准备面试。掌握这些知识点,有助于提升面试表现和实际工作能力。
66 1
|
1月前
|
前端开发 JavaScript
JavaScript新纪元:ES6+特性深度解析与实战应用
【10月更文挑战第29天】本文深入解析ES6+的核心特性,包括箭头函数、模板字符串、解构赋值、Promise、模块化和类等,结合实战应用,展示如何利用这些新特性编写更加高效和优雅的代码。
46 0
|
1月前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
26 1
JavaScript中的原型 保姆级文章一文搞懂
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
105 2

推荐镜像

更多