了解javascript中变量及函数的提升

yizhihongxing

当 JavaScript 运行一个函数时,会进行两个阶段的操作:

  1. 预编译阶段,它会扫描整个函数代码,收集函数中的变量声明,将其存储在内存中。在这个阶段,JavaScript 引擎会将函数中的变量声明提升到函数体的顶部,并给它赋上默认值 undefined。这个过程就是 变量提升(Hoisting)

  2. 执行阶段,逐行执行函数中可执行的语句。

下面是一个变量提升的示例:

console.log(x); // undefined
var x = 1;

在预编译阶段,变量 x 被提升到函数体的顶部,当程序运行到 console.log(x) 时,由于变量 x 虽然已经被提升,但未被赋值,所以输出 undefined

变量提升有一个例外:用 letconst 声明的变量不会被提前声明。这是因为 letconst 声明的变量具有块级作用域。

下面是一个函数提升的示例:

hello();

function hello() {
  console.log('Hello World!');
}

// 输出:Hello World!

在预编译阶段,函数 hello 被提升到函数体的顶部,因此即使在函数声明之前调用函数,也不会出现 ReferenceError。

需要注意的是,对于函数表达式,变量名的提升与函数不同,变量名不会被带到函数体的顶部。在调用函数之前,该变量名不能被访问。

下面是一个函数表达式的示例:

hello();

var hello = function() {
  console.log('Hello World!');
}

// TypeError: hello is not a function

在预编译阶段,变量 hello 被提升到函数体的顶部,但此时它的值为 undefined。当程序运行到 hello() 时,尝试调用一个未定义的变量会抛出 TypeError 异常。

综上所述,了解变量及函数的提升对于理解 JavaScript 中作用域和闭包等概念至关重要。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:了解javascript中变量及函数的提升 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • promise和co搭配生成器函数方式解决js代码异步流程的比较

    使用Promise和co搭配生成器函数方式是一种优雅简洁地处理JavaScript异步流程的方法。下面我们将详细讲解如何使用Promise和co搭配生成器函数的方式解决异步流程的问题,并提供两个示例说明。 Promise Promise是一种在JavaScript中处理异步操作的标准方法,它能够帮助我们减少大量的回调函数。Promise可以让我们的代码更加可…

    node js 2023年6月8日
    00
  • js实现axios限制请求队列

    要实现 axios 的请求队列限制,一般需要使用队列或者 Promise.all 的方式来统一管理请求。以下是实现过程的详细攻略。 1. 队列方式实现axios请求队列限制 使用队列来实现 axios 请求队列限制有以下几个步骤: 定义一个队列,用来存储请求。 const requestQueue = []; 定义一个函数,用来从队列中取出一个请求,并发送该…

    node js 2023年6月8日
    00
  • Centos7 中安装 Node.js v4.4.4

    下面是“Centos7中安装Node.js v4.4.4”的完整攻略: 确认系统版本 在安装Node.js之前,需要确认操作系统版本是否为Centos7。可以在终端中输入以下命令查看: cat /etc/centos-release 如果版本为Centos7,继续进行下一步操作。 安装必要的依赖 在安装Node.js之前,需要先安装一些必要的依赖,以确保No…

    node js 2023年6月8日
    00
  • Node.js卸载与重装及zip与msi安装详解

    Node.js卸载与重装及zip与msi安装详解 当我们需要重新安装或升级Node.js时,有三个主要的安装方式可以选择,分别是zip包、msi文件和macOS PKG文件。同时,为确保重新安装或升级能成功进行,我们可能需要卸载原有的Node.js版本。 卸载Node.js Windows系统下的卸载 对于Windows系统,卸载Node.js的主要步骤有:…

    node js 2023年6月8日
    00
  • Node.js连接mongo数据库上传文件的方法步骤

    下面是“Node.js连接mongo数据库上传文件的方法步骤”的完整攻略: 1. 安装依赖 在Node.js中连接mongo数据库,需要使用到mongoose,参考以下命令进行安装: npm install mongoose 同时,也需要使用到multer,参考以下命令进行安装: npm install multer 2. 连接MongoDB数据库 使用mo…

    node js 2023年6月8日
    00
  • nodejs结合Socket.IO实现websocket即时通讯

    下面是“nodejs结合Socket.IO实现websocket即时通讯”的完整攻略。 一、什么是WebSocket WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。WebSocket协议在浏览器和服务器之间建立全双工通讯,使得浏览器可以实时向服务器推送数据。相比于传统的HTTP协议,WebSocket在实现实时通讯方面有…

    node js 2023年6月8日
    00
  • Nodejs学习笔记之Global Objects全局对象

    下面详细讲解一下“Nodejs学习笔记之Global Objects全局对象”的攻略。 1. 什么是Global Objects? 在Node.js的全局作用域中,存在一些对象,这些对象可以在任何地方访问,被称作全局对象,其中包括: global对象:它是一个全局对象,可以在任何地方访问,如果一个变量在所有模块中都是全局变量,它就是global对象的属性之一…

    node js 2023年6月8日
    00
  • nodejs使用Sequelize框架操作数据库的实现

    当使用Node.js开发Web应用时,数据库是难以避免的,Sequelize是一个优秀的ORM(Object-Relational Mapping, 对象关系映射)框架,它能够让开发者通过JavaScript的方式操作数据库,这里提供一份使用Sequelize框架操作数据库的攻略。 安装Sequelize 在开始使用Sequelize之前,需要先安装它。可以…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部