JavaScript 中的作用域和提升 – 全面解释

javascript 中的作用域和提升 - 全面解释

javascript 中的作用域

javascript 中的范围是指代码中可以使用或查看某些变量或函数的区域。它定义了您可以在何处访问特定值或操作。 javascript 中的作用域主要有两种类型:

全球范围

本地作用域(函数和块作用域)

全球范围

当变量在任何函数或块之外声明时,它就成为全局范围的一部分。可以从代码中的任何位置访问它。

let globalvar = "i'm global";function printglobalvar() {  console.log(globalvar); // accessible here}printglobalvar(); // output: i'm globalconsole.log(globalvar); // output: i'm global

在此示例中,globalvar 在任何函数之外声明,这使其成为全局变量。这意味着可以在代码中的任何位置访问它,无论是在函数内部还是在函数外部。当调用 printglobalvar() 函数时,它会记录 globalvar 的值,因为该函数可以访问全局范围。之后,当我们直接在函数外部记录 globalvar 时,它仍然会打印相同的值,因为它在整个程序中都可以作为全局变量使用。本质上,全局作用域允许在代码中的任何位置使用和访问该变量。

立即学习“Java免费学习笔记(深入)”;

本地作用域(函数和块作用域)

函数或块中定义的变量(如循环或 if 语句)仅限于该函数或块。无法从该范围之外访问它们。

函数作用域:函数内声明的变量只能在该函数内访问。

function myfunction() {  let localvar = "i'm local";  console.log(localvar); // output: i'm local}myfunction();console.log(localvar); // error: localvar is not defined

块作用域:与 let 和 const 一起引入的块作用域适用于块 ({}) 内声明的变量,例如循环、条件和 try-catch 块。这些变量只能在该块内访问。

if (true) {  let blockvar = "i'm block scoped";  console.log(blockvar); // output: i'm block scoped}console.log(blockvar); // error: blockvar is not defined

相比之下,用 var 声明的变量是函数作用域,这意味着它们被提升到函数顶部或全局,即使在块内声明也是如此。

javascript 中的提升

提升是 javascript 在编译阶段将声明移动到其包含范围顶部的默认行为。这意味着在执行任何代码之前都会处理变量和函数声明。

变量提升

在使用 var 声明变量的情况下,变量会被提升,但其初始化不会。如果您尝试在初始化之前访问变量,这会导致臭名昭著的“未定义”行为。

console.log(myvar); // output: undefinedvar myvar = "hello";console.log(myvar); // output: hello

javascript 引擎在幕后执行以下操作:

var myvar;console.log(myvar); // output: undefinedmyvar = "hello";console.log(myvar); // output: hello

在此示例中,javascript 将 var myvar 声明提升到顶部,因此代码的行为就像是写在顶部一样。第一个 console.log 输出未定义,因为该变量已声明(提升)但尚未分配值。分配后,第二个 console.log 输出 5。这显示了提升如何与 var 一起工作——声明被提升,但值稍后分配。

对于 let 和 const,当声明被提升时,它们不会被初始化,直到代码到达该行,并且尝试在声明之前访问它们会导致引用错误。

console.log(mylet); // referenceerror: cannot access 'mylet' before initializationlet mylet = "hello";

功能提升

函数声明完全提升,这意味着您可以在声明之前调用函数。

greet(); // output: hello, world!function greet() {  console.log("hello, world!");}

函数移至顶部,因此可以在声明之前调用。

但是,使用 var、let 或 const 的函数表达式 不会以与函数声明相同的方式提升。它们在提升方面的行为类似于常规变量,这意味着该函数仅在赋值后才可用。

greet(); // Error: greet is not a functionvar greet = function() {  console.log("Hello!");};

在上面的示例中,greet 被提升为 var 变量,但最初是未定义的,因此尝试在赋值之前调用它会导致错误。

实践中的范围和提升

全局范围变量可以在整个脚本中访问。

局部作用域变量仅限于声明它们的块或函数。

提升 允许您在声明之前使用函数和变量,但对 let、const 和函数表达式有限制。

这些概念是理解变量和函数在 javascript 中的行为方式的基础,掌握它们对于编写清晰且无错误的代码至关重要。

以上就是JavaScript 中的作用域和提升 – 全面解释的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1491850.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 14:18:58
下一篇 2025年12月19日 14:19:07

相关推荐

  • TypeScript 中的 TSyringe 和依赖注入

    我不太喜欢像 nestjs 这样的大型框架;我一直喜欢以我想要的方式构建我的软件的自由,以及我以轻量级方式决定的结构。但在测试 nestjs 时我喜欢的是依赖注入。 依赖注入(di)是一种设计模式,它允许我们通过消除创建和管理类依赖关系的责任来开发松散耦合的代码。这种模式对于编写可维护、可测试和可扩…

    2025年12月19日
    000
  • 每个开发人员都应该了解的高级 JavaScript 概念

    javascript 是许多开发人员日常使用的语言,但其生态系统中存在许多隐藏的瑰宝,即使是经验丰富的开发人员也可能不熟悉。本文探讨了一些鲜为人知的 javascript 概念,它们可以显着提高您的编程技能。我们将介绍诸如 代理、符号、生成器 等概念,并通过示例演示每个概念并解决问题以说明其强大功能…

    好文分享 2025年12月19日
    000
  • 为多租户应用程序实施 ASPNET Identity:最佳实践

    构建多租户应用程序带来了独特的挑战,特别是在管理跨多个租户的用户身份验证和授权时。在本文中,我将引导您了解如何在多租户环境中实现 asp.net identity,同时遵循最佳实践以确保可扩展性、安全性和可维护性。 什么是多租户应用程序? 多租户应用程序允许多个组织(租户)使用应用程序的同一实例,每…

    2025年12月19日
    000
  • 起重面试问答

    1. javascript 中什么是提升? 答案: 提升是执行上下文创建阶段为变量和函数分配内存的过程。在此过程中,为变量分配了内存,并为变量分配了值 undefined。对于函数,整个函数定义存储在内存中的特定地址,并且对其的引用放置在该特定执行上下文中的堆栈上。 2. 变量提升和函数提升有什么区…

    2025年12月19日
    000
  • 来自 Bitbucket 管道的 Eslint 代码洞察

    本指南解释了如何使用 bitbucket pipelines 将 eslint 结果集成到 bitbucket pull 请求中。您将学习如何生成 json 格式的 eslint 报告,使用 bitbucket 报告和注释 api 将这些报告作为内联注释发布,以及配置 bitbucket 管道以自动…

    2025年12月19日
    000
  • 适用于您日常工作流程的 ESEST 提示、技巧、最佳实践和代码片段示例

    es6 (ecmascript 2015) 对 javascript 进行了重大改革,引入了许多新功能,可以简化您的编码并提高项目的整体质量。 在这篇文章中,我们将介绍一些es2015 提示、技巧、最佳实践,并提供代码片段示例来增强您的日常工作流程。 1. 声明变量:let 和 const 与 va…

    2025年12月19日
    000
  • 使用 Secrets Loader 轻松管理 Laravel 和 JS 项目

    跨各种环境管理 api 密钥、令牌和凭证等敏感数据可能非常棘手,尤其是在开发和部署应用程序时。确保秘密在需要时安全地存储和获取,而不是将它们硬编码到版本控制中,对于维护安全性至关重要。 这就是我创建 secrets loader 的原因,这是一个 bash 脚本,可以动态地将 aws ssm 和 c…

    2025年12月19日
    000
  • 如何在Reactjs中制作动态进度条

    使用 react 和循环进度组件构建性能仪表板在本博客中,我们将探讨如何使用 react 构建性能指标仪表板。仪表板显示不同绩效指标(例如可访问性、seo 和最佳实践)的循环进度指示器。进度指示器逐渐填满,模拟加载动画。 该项目使用 tailwind css 进行样式设计,并组合了多个组件来创建灵活…

    2025年12月19日
    000
  • DSA 与 JS:用 JavaScript 解释大 O 表示法

    废话不多说,我们直接进入正题吧。什么是大 o 表示法以及它的用途是什么?明确的答案是 big o 表示法是一种描述算法性能如何随着输入大小的增长而变化的方法。它可以帮助您了解处理越来越大的数据量时代码的速度有多快或多慢。 简单来说,big o 会告诉您最坏的情况,即随着输入变大,代码将花费多长时间或…

    2025年12月19日
    000
  • 执行上下文和调用堆栈

    为顶级代码创建全局执行上下文,即不在任何 fn 内的代码。因此,首先执行 fn 之外的代码。fn-decln/exprsn 的 fn 主体内的代码仅在调用时执行。 执行上下文(ec) 一段js执行的环境。存储一些要执行的代码的所有必要信息,例如局部变量、传递给 fn 的 args。js 代码始终在 …

    2025年12月19日
    000
  • 了解 JavaScript 中的变量:初学者指南

    理解 javascript 中的变量:初学者指南 欢迎回到我们的 javascript 世界之旅!在这篇博文中,我们将深入探讨编程中的基本概念之一:变量。变量对于在 javascript 程序中存储和操作数据至关重要。我们将介绍什么是变量、如何声明它们以及 javascript 中变量的不同类型。让…

    2025年12月19日
    000
  • JavaScript 中的临时死区 (TDZ) 和提升:

    JavaScript 中的临时死区 (TDZ) 和提升: 临时死区(TDZ):临时死区是指进入作用域(如块或函数)和声明变量之间的时间段。在此区域中,任何访问变量的尝试都将导致引用错误。 TDZ 存在于初始化之前使用 let、const 和 class 声明的变量。 示例: console.log(…

    2025年12月19日
    000
  • 了解 CORS 在 Web 浏览器中的工作原理

    跨源资源共享 (cors) 是 web 浏览器中的一项重要安全功能,它控制 web 应用程序如何从与提供初始网页的域不同的域请求资源(例如数据、图像或脚本) 。它的主要目的是保护用户免受试图访问其他网站上敏感信息的恶意网站的侵害。本博客将解释 cors 的工作原理以及为什么它对于 web 开发至关重…

    2025年12月19日
    000
  • JavaScript 中的提升

    什么是 javascript 提升? 提升是指 javascript 中在执行之前进行声明的过程。首先处理变量和函数声明。因此,即使变量在声明之前被引用,也不会导致错误,而是返回 undefined。对于函数声明,整个函数被提升,这意味着它可以在代码中定义之前使用。此过程在执行开始之前将声明放入堆栈…

    2025年12月19日
    000
  • JavaScript 中的闭包

    你好, 在这篇文章中,让我们学习闭包。 闭包在 javascript 中至关重要,因为它们允许函数从其父作用域访问变量,即使在父函数关闭之后也是如此。这对于需要随着时间的推移记住数据的函数至关重要,例如回调函数或维护状态。这里要记住的一点是父作用域中未使用的变量将被垃圾收集。 定义:闭包是捆绑在一起…

    2025年12月19日
    000
  • JavaScript 中的五种作用域:开发人员深入探讨

    javascript 对变量的行为是由它的作用域决定的。理解范围是编写健壮、可维护的代码的基础。本文将探讨 javascript 中的五种主要作用域类型——全局、局部、块、函数作用域(和闭包)和作用域链。最后,您将清楚地掌握 javascript 如何跨不同上下文处理变量。 目录 1. 全球范围 解…

    2025年12月19日
    000
  • 电子书

    es6 (ecmascript 2015) 为 javascript 引入了多项新功能和语法改进。以下是最重要的 es6 语法的总结和示例: 1. let 和 const 关键字 es6 为块作用域变量引入了 let 和 const。 let:块范围变量,可以更新,但不能在同一范围内重新声明。con…

    2025年12月19日
    000
  • 前端尝试

    这是前端挑战 v24.09.04 的提交内容,美化我的标记:space 我建造了什么 我构建了一个以太空为主题的登陆页面,提供有关太空探索的信息。目标是创造一个有吸引力的简约设计,突出太空历史、当前任务、未来任务等的关键方面。该页面包括主页、关于、历史、当前任务、未来任务、调查问卷和联系信息等部分。…

    2025年12月19日 好文分享
    000
  • 使用 useRoleManagement Hook 处理不同环境中的动态角色名称(第 2 部分)

    在本系列的第一部分中,我们探索了使用 userolemanagement 钩子在 react 中实现基于角色的访问控制的基础。如果你还没有读过,可以在这里查看在 react 中实现基于角色的访问控制:深入探讨 userolemanagement hook。 在第二部分中,我们将根据不同的环境(例如登…

    2025年12月19日
    000
  • JavaScript 模块

    现在我们不再将所有 js 写在一个文件中并发送给客户端。今天,我们将代码编写到模块中,这些模块之间共享数据并且更易于维护。约定是使用驼峰命名法命名模块。我们甚至可以通过 npm 存储库将第 3 方模块包含到我们自己的代码中,例如 jquery、react、webpack、babel 等。最终的捆绑包…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信