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

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 前言面试官最爱考的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

相关文章
|
23天前
|
JavaScript
js 解析 byte数组 成字符串
js 解析 byte数组 成字符串
|
21天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
178 37
|
16天前
|
缓存 Android开发 开发者
Android RecycleView 深度解析与面试题梳理
本文详细介绍了Android开发中高效且功能强大的`RecyclerView`,包括其架构概览、工作流程及滑动优化机制,并解析了常见的面试题。通过理解`RecyclerView`的核心组件及其优化技巧,帮助开发者提升应用性能并应对技术面试。
40 8
|
16天前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
39 8
|
2月前
|
Rust JavaScript 前端开发
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
Rust! 无VDom! 尤雨溪解析 Vue.js 2024 新特性
|
1月前
|
JavaScript 前端开发 API
Javaweb之javascript的BOM对象的详细解析
BOM为Web开发提供了强大的API,允许开发者与浏览器进行深入的交互。合理使用BOM中的对象和方法,可以极大地增强Web应用的功能性和用户体验。需要注意的是,BOM的某些特征可能会在不同浏览器中表现不一致,因此在开发过程中需要进行仔细的测试和兼容性处理。通过掌握BOM,开发者能够制作出更丰富、更动态、更交互性的JavaWeb应用。
18 1
|
1月前
|
自然语言处理 前端开发 JavaScript
Javaweb之javascript的详细解析
通过明确JavaScript的定位,掌握其核心概念和相关技术栈,在实现交互丰富的Web应用时,JavaScript就能够发挥它不可替代的作用。随着前后端分离趋势的推进,JavaScript在现代 Web 开发中变得更加重要,不仅限于传统的 JavaWeb 应用,而是广泛应用于各种类型的前端项目。
15 0
|
2月前
|
开发者 图形学 C#
深度解密:Unity游戏开发中的动画艺术——Mecanim状态机如何让游戏角色栩栩如生:从基础设置到高级状态切换的全面指南,助你打造流畅自然的游戏动画体验
【8月更文挑战第31天】Unity动画系统是游戏开发的关键部分,尤其适用于复杂角色动画。本文通过具体案例讲解Mecanim动画状态机的使用方法及原理。我们创建一个游戏角色并设计行走、奔跑和攻击动画,详细介绍动画状态机设置及脚本控制。首先导入动画资源并添加Animator组件,然后创建Animator Controller并设置状态间的转换条件。通过编写C#脚本(如PlayerMovement)控制动画状态切换,实现基于玩家输入的动画过渡。此方法不仅适用于游戏角色,还可用于任何需动态动画响应的对象,增强游戏的真实感与互动性。
58 0
|
2月前
|
JavaScript 前端开发
|
2月前
|
前端开发 Java UED
JSF 面向组件开发究竟藏着何种奥秘?带你探寻可复用 UI 组件设计的神秘之路
【8月更文挑战第31天】在现代软件开发中,高效与可维护性至关重要。JavaServer Faces(JSF)框架通过其面向组件的开发模式,提供了构建复杂用户界面的强大工具,特别适用于设计可复用的 UI 组件。通过合理设计组件的功能与外观,可以显著提高开发效率并降低维护成本。本文以一个具体的 `MessageComponent` 示例展示了如何创建可复用的 JSF 组件,并介绍了如何在 JSF 页面中使用这些组件。结合其他技术如 PrimeFaces 和 Bootstrap,可以进一步丰富组件库,提升用户体验。
45 0

推荐镜像

更多
下一篇
无影云桌面