目录
二、进一步了解
三、逐步了解
四、深入了解
首页 web前端 js教程 javascript声明提升的介绍(附示例)

javascript声明提升的介绍(附示例)

Mar 22, 2019 am 09:39 AM
javascript

本篇文章给大家带来的内容是关于javascript声明提升的介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

Javascript声明提升

在分析声明提升之前,我认为有必要知道的两点:

一、引擎查询变量的两种方式

引擎查询变量的方式可以分为LHS和RHS两种方式,通过“L”和“R”是可以大致了解意思,分别是赋值操作的左侧和右侧。 (不能光是理解为“=”的左右侧可不行,因为赋值操作的形式有多种。)

简单说下我对这两种查询方式的理解:
LHS:赋值操作的目标是谁。 (查询变量)
RHS:谁是赋值操作的源头。 (查询变量的值)

这样说可能有些难以理解,举个栗子:

function foo(a){
    //这里存在一个隐式变量分配,LHS查询变量a,并赋值2.
    //隐式a = 2;
    //左边LHS查询变量b,查询作用域中是否存在b这个变量。
    //右边RHS查询变量a的值,将a赋值给b。
    var b = a;
    //返回a,b是RHS查询变量a的值和变量b的值并使用。
    return a + b;
}
//左边LHS查询变量c,查询作用域中是否存在c这个变量。
//右边RHS引用函数foo,将2作为参数传进去。
var c = foo(2);
登录后复制

二、异常

关于异常要强调一点,必须在严格模式下。因为在非严格模式下,LHS查询若是在最顶层的全局作用域上找不到查询的变量,则会创建一个该名称变量返还给引擎。

ReferenceError:同作用域判别失败相关。(比如:作用域中遍寻不到所需的变量)
TypeError:作用域判别成功了,但是对结果的操作是非法或不合理的。(比如:试图对一个非函数类型的值进行函数调用,或者引用null或undefined类型的值中的属性)

举个栗子:

"strict"
function foo() {
    console.log(a) //undefined
    console.log(b) //ReferenceError
}
var a = 2;
登录后复制

声明提升

一、初步了解

编写javascript代码时,很多时候都会觉得代码会自上而下的执行。但是碰到声明提升,这种想法就会被打破。

举个栗子:

a = 2;
var a;
console.log(a);

运行结果为: 2
登录后复制

如果按照常理的自上而下执行,那么a执行的预期结果应当是undefined,然而为什么会是2?
这就是声明提升的结果。

二、进一步了解

当初步了解声明提升的时候,碰上下面的代码:

console.log(a);
var a = 2;

运行结果为:undefined
登录后复制

初步了解声明提升之后,会自然而然的认为,声明就会被提升,然而声明的时候赋值,却得不到变量的值。

其实,上面代码的运行步骤可以分解为:

var a; //声明提升
console.log(a); //打印a的值
a = 2; //对a进行赋值
登录后复制

原来,声明提升就是字面上的声明提升,其余的操作(如:赋值和其他逻辑)都还在原地踏步。

声明一个函数进行相应的操作,会得到函数声明提升的结果。由此可以发现:变量和函数的声明都会被提升在其他代码的前面执行。

三、逐步了解

通过几次试验可以逐步了解到,其实声明提升就是:变量和函数的声明会被提升在其他代码(当前作用域)的前面执行。

走到这里,有人就会想到,要是函数表达式,也会进行提升吗?

答案是:不会。而且,即使是具名函数表达式,在名称标识符赋值之前也是不能使用的。

举个栗子:

foo(); //TypeError
bar(); //ReferenceError
var foo = function bar(){};
登录后复制

代码分解为:

var foo; //变量声明提升
foo(); //foo对undefined值进行函数调用导致非法操作,故TypeError
bar(); //bar函数并没有声明,故ReferenceError
foo = function bar(){}; //对foo进行赋值
登录后复制

所以:函数表达式在名称标识符赋值之前是不能使用的。

注意:1、每个作用域都会进行提升操作。(所以函数内部形成的作用域也会有提升操作,提升            操作仅限当前的函数内部作用域)
2、在函数和变量提升时,函数优先提升。
3、一个普通块内部的函数声明通常会被提升到所在的作用域的顶部。

四、深入了解

在阅读《你不知道的javascript》时,学习let的过程中,会发现有说明提到:使用let进行的声明不会在作用域中进行提升。声明的代码在被运行之前是,声明并不存在。

举个栗子:

console.log(a);
let a = 2;

运行结果是:ReferenceError: Cannot access 'a' before initialization. //初始化前无法访问"a"
登录后复制

然后回到之前我运行的代码,将let换为var,返回的结果是undefined。

二者结合,再加上阅读我用了两个月的时间才理解let这篇文章,发现对let是否提升有了一个更新的认识。

作者把js变量分成三部分操作:创建(create)、初始化(initialize)和赋值(assign)

上面的操作之所以会有不同的响应并不是说let没有创建,而是有一个初始化的过程并没有执行。而在初始化之前使用变量,就会形成一个暂时性死区

经过var和let和function的测试可以总结到:

var的创建和初始化被提升,赋值不会被提升。

let的创建被提升,初始化和赋值不会被提升。

function的创建、初始化和赋值均会被提升。

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript教程视频栏目!

以上是javascript声明提升的介绍(附示例)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何使用WebSocket和JavaScript实现在线语音识别系统 如何使用WebSocket和JavaScript实现在线语音识别系统 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript实现在线语音识别系统引言:随着科技的不断发展,语音识别技术已经成为了人工智能领域的重要组成部分。而基于WebSocket和JavaScript实现的在线语音识别系统,具备了低延迟、实时性和跨平台的特点,成为了一种被广泛应用的解决方案。本文将介绍如何使用WebSocket和JavaScript来实现在线语音识别系

WebSocket与JavaScript:实现实时监控系统的关键技术 WebSocket与JavaScript:实现实时监控系统的关键技术 Dec 17, 2023 pm 05:30 PM

WebSocket与JavaScript:实现实时监控系统的关键技术引言:随着互联网技术的快速发展,实时监控系统在各个领域中得到了广泛的应用。而实现实时监控的关键技术之一就是WebSocket与JavaScript的结合使用。本文将介绍WebSocket与JavaScript在实时监控系统中的应用,并给出代码示例,详细解释其实现原理。一、WebSocket技

如何利用JavaScript和WebSocket实现实时在线点餐系统 如何利用JavaScript和WebSocket实现实时在线点餐系统 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket实现实时在线点餐系统介绍:随着互联网的普及和技术的进步,越来越多的餐厅开始提供在线点餐服务。为了实现实时在线点餐系统,我们可以利用JavaScript和WebSocket技术。WebSocket是一种基于TCP协议的全双工通信协议,可以实现客户端与服务器的实时双向通信。在实时在线点餐系统中,当用户选择菜品并下单

如何使用WebSocket和JavaScript实现在线预约系统 如何使用WebSocket和JavaScript实现在线预约系统 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript实现在线预约系统在当今数字化的时代,越来越多的业务和服务都需要提供在线预约功能。而实现一个高效、实时的在线预约系统是至关重要的。本文将介绍如何使用WebSocket和JavaScript来实现一个在线预约系统,并提供具体的代码示例。一、什么是WebSocketWebSocket是一种在单个TCP连接上进行全双工

JavaScript和WebSocket:打造高效的实时天气预报系统 JavaScript和WebSocket:打造高效的实时天气预报系统 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的实时天气预报系统引言:如今,天气预报的准确性对于日常生活以及决策制定具有重要意义。随着技术的发展,我们可以通过实时获取天气数据来提供更准确可靠的天气预报。在本文中,我们将学习如何使用JavaScript和WebSocket技术,来构建一个高效的实时天气预报系统。本文将通过具体的代码示例来展示实现的过程。We

简易JavaScript教程:获取HTTP状态码的方法 简易JavaScript教程:获取HTTP状态码的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教程:如何获取HTTP状态码,需要具体代码示例前言:在Web开发中,经常会涉及到与服务器进行数据交互的场景。在与服务器进行通信时,我们经常需要获取返回的HTTP状态码来判断操作是否成功,根据不同的状态码来进行相应的处理。本篇文章将教你如何使用JavaScript获取HTTP状态码,并提供一些实用的代码示例。使用XMLHttpRequest

javascript中如何使用insertBefore javascript中如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用于在DOM树中插入一个新的节点。这个方法需要两个参数:要插入的新节点和参考节点(即新节点将要被插入的位置的节点)。

JavaScript和WebSocket:打造高效的实时图像处理系统 JavaScript和WebSocket:打造高效的实时图像处理系统 Dec 17, 2023 am 08:41 AM

JavaScript是一种广泛应用于Web开发的编程语言,而WebSocket则是一种用于实时通信的网络协议。结合二者的强大功能,我们可以打造一个高效的实时图像处理系统。本文将介绍如何利用JavaScript和WebSocket来实现这个系统,并提供具体的代码示例。首先,我们需要明确实时图像处理系统的需求和目标。假设我们有一个摄像头设备,可以采集实时的图像数

See all articles