广告
返回顶部
首页 > 资讯 > 精选 >JavaScript中变量提升与预编译的示例分析
  • 958
分享到

JavaScript中变量提升与预编译的示例分析

2023-06-06 16:06:28 958人浏览 独家记忆
摘要

这篇文章主要为大家展示了javascript中变量提升与预编译的示例分析,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“JavaScript中变量提升与预编译的示例分析”这篇文章吧。Java的特点有

这篇文章主要为大家展示了javascript中变量提升与预编译的示例分析,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“JavaScript中变量提升与预编译的示例分析”这篇文章吧。

Java的特点有哪些

Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。2.Java具有简单性、面向对象、分布式安全性、平台独立与可移植性、动态性等特点。3.使用Java可以编写桌面应用程序、WEB应用程序、分布式系统和嵌入式系统应用程序等。

一、有趣的现象

按照大家的常识,JavaScript代码在执行是一定是自上而下的,你需要输出一个字符串,当然需要提前声明一个保存string类型的变量。如果深奥的道理我都能懂,于是我阅读了下面的代码。

1.1 我以为的开局
var str = '123';console.log(str); // 123

我们调换一下代码的位置在再看:

console.log(str); // undefinedvar str = '123';

我好像找到规律了!!!

当我看完了前两段代码并且进行了“深度思考”后,我好像找到规律了,那就是:在当前代码块后函数中,在变量声明和初始化之前使用变量,会拿不到正确的值。

2 实际上是这样的

带着上面的“结论”我来到了这里

var val = '余光';(function(){    console.log(val); // 余光})();

果然如此!,在变量声明和初始化之后耶稣也阻挡不了我拿到val的值,我说的!!!

当我看到下面一段代码时,我已经产生了动摇,此事必要蹊跷。

var val = '余光';(function(){    console.log(val); // undefined    var val = '测试';})();

Ps:如果大家立即执行函数存在疑问,不妨看看《JavaScript之深入理解立即调用函数表达式(IIFE)》吧~

这…我怂了,是什么原因导致这样的现象发生的呢?js又是如果处理的呢?

二、Js的预解析

在当前的作用域内,无论在哪里变量声明,在幕后,都会进行一次看不见的移动。

注意:仅声明被“移动”。即声明和赋值在某些时候被动分开了。而这次看不见的移动实际上就是Js在编译阶段的解析

来看一段《你知不知道的Js》中经典的例子:

name = '余光'; // 未添加关键字(未声明),name为全局变量,,即window.name = '余光'var name; // 再次声明name,此时name未进行初始化,它的值是undefined吗?console.log(name); // ?

结果是成功打印“余光”,这样看不见的移动就发生在Js预解析(编译)之中。

2.1 核心:预解析

为了搞明白这个核心问题,我们需要回顾一下,引擎会在解释JavaScript代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。感兴趣的小伙伴可以阅读《JavaScript中的变量对象》和《从作用域到作用域链》这两篇文章哦~

因此,发生这样的事情,包括变量函数在内的所有声明都会在任何代码被执行前首先被处理。当你看到var a = 2;时,可能会认为这是一个声明。但JavaScript实际上会将其看成两个声明:var a;和a = 2;。

  • 第一个定义声明是在编译阶段进行的。

  • 第二个赋值声明会被留在原地等待执行阶段。

即代码是这样写的:

// 我们看到的代码:var name = '余光';

但Js会将它解析成:

// 声明(Declaration)var name; // 声明但未初始化,所以分配 undefined// 初始化(Initialization)name = '余光'; // 初始化(赋值)

所以本小结的一段代码应该这样分析:

var name; // 声明name提到作用域顶部,并被分配了一个undefinedname = '余光'; // 进行初始化操作console.log(name); // '余光'
2.2 注意:只有声明被提升了

只有声明会被提升,而赋值和其他代码逻辑会在执行到代码的位置时才会生效。所以会有下面的问题:

foo();function foo(){    console.log(name); // undefined    var name = '余光';}

函数被提升了,自然可以正常执行,但变量仅仅是声明被提升了。

2.3 每个作用域都会进行提升操作

还是上面的代码:

foo();function foo(){    console.log(name); // undefined    var name = '余光';}

实际它在编译时是这样的:

function foo(){    var name; // 声明    console.log(name); // undefined    name = '余光'; // 初始化}foo(); // 函数执行

三、提升之间的优先级

既然我们知道了变量函数会被提升,他们之间又是如何判断优先级的呢?

3.1 函数会被首先提升,然后才是变量

我们分析下面的代码:

foo();var foo; // 1function foo(){    console.log('余光');}foo = function(){    console.log('小李');}

本着函数优先提升的原则,他会被解析成这样:

function foo(){    console.log('余光');}foo(); // 余光foo = function(){    console.log('小李');}

注意,var foo 因为是一个重复声明,且优先级低于函数声明所以它被忽略掉了。

3.2 函数字面量不会进行函数提升

最直观的例子,就是在函数字面量前调用该函数:

foo();var foo = function(){    console.log(1);}// TypeError: foo is not a function

这段程序中:

  1. 变量标识符foo被提升并分配给所在作用域(在这里是全局作用域),因此在执行foo()时不会导致ReferenceError(),而是会提示你 foo is not a function

  2. 然后就是执行foo,foo此时并没有赋值(注意变量被提升了)。由于对undefined值进行函数调用而导致非法操作,因此抛出TypeError异常。

四、ES6和小结

es6新增了两个命令letconst,用来声明变量,有关它们完整的概念我会在《ES6基础系列》中总结,提起它们,是因为变量提升在它们身上不会存在

4.1 变量提升是可以规避的

let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。

// var 的情况console.log(foo); // 输出undefinedvar foo = 2;// let 的情况console.log(bar); // 报错ReferenceErrorlet bar = 2;

上面代码中,变量foo用var命令声明,会发生变量提升,即脚本开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined。变量bar用let命令声明,不会发生变量提升。这表示在声明它之前,变量bar是不存在的,这时如果用到它,就会抛出一个错误。

在变量提升上,const和let一样,只在声明所在的块级作用域内有效,也不会变量提升

4.2 小结
  1. 变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部,但变量的初始化不会提升;

  2. 函数提升:函数声明可以被看作是函数的整体被提升到了代码的顶部,但函数字面量表达式并不会引发函数提升;

  3. 函数提升优先与变量提升;

  4. let和const可以有效的规避变量提升

最后提炼一下:JavaScript引擎并不总是按照代码的顺序来进行解析。在编译阶段,无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理,这个过程被称为提升。声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。

以上就是关于“JavaScript中变量提升与预编译的示例分析”的内容,如果改文章对你有所帮助并觉得写得不错,劳请分享给你的好友一起学习新知识,若想了解更多相关知识内容,请多多关注编程网精选频道。

--结束END--

本文标题: JavaScript中变量提升与预编译的示例分析

本文链接: https://www.lsjlt.com/news/247747.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中变量提升与预编译的示例分析
    这篇文章主要为大家展示了JavaScript中变量提升与预编译的示例分析,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带大家一起来研究并学习一下“JavaScript中变量提升与预编译的示例分析”这篇文章吧。Java的特点有...
    99+
    2023-06-06
  • javascript中变量提升的示例分析
    这篇文章主要介绍了javascript中变量提升的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。如下所示:a = ...
    99+
    2022-10-19
  • JavaScript中预编译的示例分析
    小编给大家分享一下JavaScript中预编译的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!JavaScript 预编...
    99+
    2022-10-19
  • javascript中变量提升和闭包的示例分析
    这篇文章主要介绍了javascript中变量提升和闭包的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们先来看一个题目:<s...
    99+
    2022-10-19
  • JavaScript中的变量提升实例分析
    这篇文章主要介绍“JavaScript中的变量提升实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的变量提升实例分析”文章能帮助大家解决问题。前言:JavaScript中...
    99+
    2023-06-30
  • JavaScript的变量提升实例分析
    本篇内容介绍了“JavaScript的变量提升实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  ...
    99+
    2022-10-19
  • 基于js变量提升和函数提升的示例分析
    小编给大家分享一下基于js变量提升和函数提升的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、变量提升在ES6之前,J...
    99+
    2022-10-19
  • JavaScript中变量对象的示例分析
    这篇文章主要介绍JavaScript中变量对象的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、变量对象在函数上下文中,我们用活动对象(activation object, AO)来表示变量对象。活动对象和...
    99+
    2023-06-14
  • Ivy编译器中增量DOM的示例分析
    这篇文章主要为大家展示了“Ivy编译器中增量DOM的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Ivy编译器中增量DOM的示例分析”这篇文章吧。作为“...
    99+
    2022-10-19
  • JavaScript中变量、数据类型的示例分析
    小编给大家分享一下JavaScript中变量、数据类型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1 如何声明变量变...
    99+
    2022-10-19
  • Shell编程中特殊变量的示例分析
    这篇文章给大家分享的是有关Shell编程中特殊变量的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。$0 $# $n-->$[1..9] $* $@在shell中存在着一些特殊而又重要的变如:$1 $...
    99+
    2023-06-09
  • C语言中全局变量与局部变量的示例分析
    小编给大家分享一下C语言中全局变量与局部变量的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一:局部变量与全局变量1.1:局部变量局部变量:在函数内部定义...
    99+
    2023-06-25
  • python语言中变量与流程的示例分析
    这篇文章主要介绍python语言中变量与流程的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!(1)变量变量,就是值可以改变的量。设计变量,就是要考虑:需要使用到什么样的变量、分别有什么作用、变量的初始值是什么...
    99+
    2023-06-19
  • JS中内存与变量存储的示例分析
    这篇文章将为大家详细讲解有关JS中内存与变量存储的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。JS神奇的Number案例一:金额的计算与传递18.9 * 100=1889.9...
    99+
    2023-06-20
  • linux中DRBD编译安装与配置的示例分析
    这篇文章给大家分享的是有关linux中DRBD编译安装与配置的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。DRBD介绍 DRBD是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。...
    99+
    2023-06-12
  • Linux C中多线程与volatile变量的示例分析
    这篇文章主要介绍Linux C中多线程与volatile变量的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Linux C中多线程与volatile变量volatile 修饰的变量表示改变量的值是易变的,编译...
    99+
    2023-06-09
  • javascript中变量、作用域和内存的示例分析
    这篇文章主要介绍javascript中变量、作用域和内存的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!javascript 的变量、作用域和内存问题(一)JavaScrip...
    99+
    2022-10-19
  • Shell编程中变量数值计算的示例分析
    小编给大家分享一下Shell编程中变量数值计算的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!如果要执行运算,那就少不了运算符,和其他的编程语言相似,shell也有很多的运算符如下:+、-、:代表着加号 和减号 或...
    99+
    2023-06-09
  • JavaScript中变量作用域及内存问题的示例分析
    这篇文章给大家分享的是有关JavaScript中变量作用域及内存问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。学习要点:1.变量及作用域2.内存问题JavaScri...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作