详解js变量声明提升

【26JavaScript声明提升】JavaScript声明提升:变量和函数的神秘提前现象,详解作用域中的变量声明和函数声明提升现象,助您轻松理解代码执行顺序。 在 JavaScript 中,变量和函数声明会被提升到当前作用域的顶部。这意味着可以在声明之前使用这些变量和函数。 阅读详情

之前一直觉会认为javascript代码执行是由上到下一行行执行的。自从看了《你不知道的JS》后发现这个观点并不完全正确。先来给大家举一个书本上的的例子:

  var a='hello world';
  var a;
  console.log(a); 

一开始我觉得输出的是undefined。但是真正的结果是hello world。带着疑问再看另外一段代码:

console.log(a);
var a='hello world';

借鉴与上面的例子会认为会输出一个hello world,或者是抛出一个没有声明的异常错误,然而发现这两种想法也是错误。输出的结果是‘undefined’。这书非常人性化的总结出了结论是:

引擎解释javascript代码的之前会对其进行编译。在编译过程中会查找所有声明,并用合适作用域将他们关联起来。换句话说,在代码执行之前,会对作用域链中所有变量和函数声明先处理完先。所以,当遇到var a=’hello world’中是 var a是先在编译阶段执行,然后在执行a=’hello world’。所以,第一段代码实质上是:

var a;
a='hello world';
console.log(a);

所以输出的就就是helloworld。总结一句话就是:只有声明被提升,而赋值或其他运算会留在原地。所以第二段代码实际上就是:

var a;
console.log(a);
a='hello world';

介绍完这两个经典例子是时候来看看一下这个例子了:

var name = "world";
(function () {
    if (typeof name == 'undefined') {
        var name = 'yang';
        console.log('Hello ' + name)
    } else {
        console.log('Hello ' + name)
    }
})()

根据javascript的运行机制和javascript没有块作用域这个特点,可以得出,变量name会声明提升移至作用域 scope (全局域或者当前函数作用域) 顶部的。所以上述代码就相当于:

var name = "world";
(function () {
    var name;
    if (typeof name == 'undefined') {
        var name = 'yang';
        console.log('Hello ' + name)
    } else {
        console.log('Hello ' + name)
    }
})()

因此,if判断的时候typeof name == ‘undefined’是true。所以会执行条件为true里面的代码。输出就是Hello yang。
那么如果想实现上面的函数,我们该如何实现?答案非常简单那就创建块作用域了。如何最简单的创建块作用域呢?那当然是采用es6的新特性let关键字。let关键字可以将变量绑定到所在的任意区域中通常在{…}中。

换句话说。let为其声明变量隐性劫持到所在区域中。下列例子中:let就绑定到if (typeof name == ‘undefined’) {…}中。所以name不会被提升,所以判断就为假,于是就可以输出我们期待已久的‘helloworld’。

var name = "world";
(function () {
    if (typeof name == 'undefined') {
        let name = 'yang';
        console.log('Hello ' + name)
    } else {
        console.log('Hello ' + name)
    }
})()

注意点:let所在的块级作用域,在声明代码被运行前,是不会像var那样会被查找到,提前声明,而是运行到了该代码才会被声明执行。下面例子很好说明这个问题:

(function (){
    console.log(b);
    let b=2;
})()

本文来源《详解js变量声明提升》

弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】 本文实例讲述了弱类型语言javascript开发中的一些坑。分享给大家供大家参考,具体如下: 测试1: (未声明变量自动提升为全局变量) test1(); function test1() { function setName() { name = '张三'; // 此处没有var声明,提升至全局 } setName(); console.log(name);// '张三' } 测试2: (函数内部局部变量的变量提升) test2(); function test2() { var a = 1; function haha() { console. 立即下载

相关推荐

Manimgl 进阶笔记

目录 一、调整视频输出的纵横比 二、调整预览窗口的尺寸 三、在开发工具中直接调试 一、调整视频输出的纵横比 调整输出视频的纵横比,在日常开发中属于比较基本的需求。要使用 Manimgl 得到期望的分辨率的视频输出需要修改以下几个地方: 第一步:在 custom_config.yml 配置文件中通过 camera_qualities设置视频的输出分辨率。manimlib 框架已经在 default_config.yml 文件中设置了四种视频输出分辨率,default_qualities 参数.

gunnery的专栏 2859

var name = ‘World!‘; (function () {if (typeof name === ‘undefined‘) {...一道关于变量提升的面试题

ar name = 'World!'; (function () { if (typeof name === 'undefined') { var name = 'Jack'; console.log('Goodbye ' + name); } else { console.log('Hello ' + name); } })(); 在 JavaScript中, Fun 和 var 会被提升 相当于 var name = '.

微光的博客 5466

告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图)

本文介绍如何使用KRobot图形化编程工具快速搭建Arduino巡线小车,无需编写代码。从硬件准备到逻辑构建,详细讲解传感器数据处理、电机控制优化及高级功能扩展,帮助教育工作者和创客爱好者10分钟内完成项目。

weixin_30632089的博客 395

一道关于作用域的题

函数作用域练习题

qq_44701728的博客 249

【Simscape】用Simscape实现三维物理仿真(三)——创建一个滑块单摆系统

1 首先创建一个Simscape Multibody 模型 (方法见 【Simscape】用Simscape实现三维物理仿真(一)——创建一个自由落体小球) 2 创建四个Solid模块 (1)摆杆 Shape : Brick Dimensions : [0.1 0.05 1] m (2)摆杆轴 Shape : Cylinder Radius : 0.02 m Le...

ReadAir的专栏 9036

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。

/保存的文件个数这里之所以需要用到委托,直接更新textbox文本中的内容,以及复制picturebox的image会提示不是从齐创建的线程调用。

morsth的博客 4816

来一份前端笔试题吗

一步一步来 先将每一个题目放置在此,往下可以查看问题答案 1、一个函数如何获取他的参数 2、如何合并两个对象 3、JS类型判断 typeof NaN / undefined == false / 1 + undefined 4、用闭包的方式实现一个计数器,可以传入一个参数数值,返回从头输入到结束所有的数值之和 5、题目如下 let a = 1 function b(a) { a = 2 console.log(a) } b(a) console.log(a) 6、题目如下 let a = b =

GonTinyBlack的博客 1172

3、提升管壳式换热器能效:双螺旋盘管的应用研究

本研究探讨了在管壳式热交换器中应用双螺旋盘管以提升能效的可行性。通过实验对比双螺旋与单螺旋盘管的热传递效率,结果显示双螺旋盘管达到54.33%的效率,显著优于单螺旋的48.88%。双螺旋结构不仅增大了换热面积,还因产生剪切应力而减少结垢,延长运行周期。采用NTU方法评估热传递性能,验证了该设计在工业应用中的高效性与实用性,建议在制冷、空调、石油精炼等领域推广使用。

k8s6orchestrator的博客 109

经典面试题(16):以下代码将输出的结果是什么?

继续我们的经典面试题,前两篇在码字上注意力有些许不集中,出现了错误,再次对大家表示抱歉。而今天这道题主要考察的是JavaScript中生僻冷门用法和容易忽视混淆的概念,据...

qq_24520459的博客 820

OpenClaw Skill 开发全攻略|2026 最新机制 + 文件处理实操,看完直接落地开发

很多新手刚接触时,会把 Skill 想得很复杂,其实大可不必。OpenClaw 中的每个 Skill,本质就是一套“能力描述 + 执行逻辑”的组合包,简单说就是“告诉 AI 你能做什么、怎么做,它就会调用你”,核心特征可以总结为这几点,好记又实用:核心载体:以文件夹为单位,不管多简单的 Skill,文件夹里都必须有 SKILL.md 文件——这是 AI 识别技能的唯一依据,少了它,再完善的代码也没用;

haolove527的专栏 7027

【WRF安装】WRF环境配置移植详细说明

【WRF安装】WRF环境配置移植详细说明

WW、forever的博客 819

查漏补缺(十二)

查漏补缺(十二)

weixin_45393020的博客 270

ArcGIS笔记13_利用ArcGIS制作岸线与水深地形数据?建立水动力模型之前的数据收集与处理?

在利用MIKE建立水动力模型之前,需要收集、处理和制作诸多数据和资料,主要有岸线数据、水深地形数据、开边界潮位驱动数据、风场数据、潮位和海流观测资料和站点潮汐调和常数资料等。本篇主要介绍这些资料的获取与处理。

晏长街的博客 5948

php 执行平台,js运行平台搭建等

一、vscode运行JS平台搭建:1、官网下载node.js 并安装 ; 2、在vscode安装插件code runner二、声明变量的方法:1、变量名或赋值语句前加上 var ,例如 var $name , var _name,var name,var name=10;2、注意变量名称一样,单大小写不一样,为两个不同的变量。例如: var name 和 var Name 为不同的变量。3、:...

weixin_42513814的博客 148

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JavaScript

文章目录JavaScript 构成JS文件延迟和异步加载:defer和async属性JavaScript代码块(代码段)基本语法区分大小写直接量转义序列标识符关键字保留字空白符(分隔符)转义字符声明变量变量提升。JavaScript变量污染基本数据类型typeof运算符知识点 JavaScript 构成 实际上,一个完整的 JavaScript 实现由以下 3 个不同部分组成: 核心(ECMAScript):语言核心部分。 文档对象模型(Document Object Model,DOM):网页文档操作标

惊鸿的技术博客 649

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

javascript 的预编译过程

javascript 的预编译过程 JS 运行三部曲 1、语法解析 (分析是否有语法错误) 2、预编译(全局 和 函数体内) 3、解释运行(除了预编译过的,一行一行运行) 预编译前奏 1、暗示全局变量(任何变量,如果未经声明就赋值,此变量就是全局变量,函数体内也不例外) 例如:a=123; 这个变量a就是全局变量 一切声明的全局变量,全是window的属性 例如:a=123;就等于window.a...

weixin_45892086的博客 252

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

终极idiomatic.js代码审查宝典:快速识别和修复JavaScript代码风格问题

idiomatic.js是一个专注于编写一致、地道JavaScript代码的开源项目,它提供了一套全面的代码风格指南,帮助开发者遵循最佳实践,提升代码质量和可维护性。无论是新手还是有经验的开发者,掌握idiomatic.js的规范都能让你的JavaScript代码更加专业、易读且高效。 ## 为什么代码风格一致性至关重要? 在软件开发中,代码风格的一致性往往被低估,但它却是影响项目成功的关键因

gitblog_00697的博客 819

2025终极Node.js代码规范指南:Airbnb风格最佳实践详解

在现代Node.js开发中,代码规范是团队协作和项目可维护性的基石。Airbnb JavaScript Style Guide作为业界最受欢迎的代码规范之一,通过清晰的规则和最佳实践帮助开发者编写高质量代码。本文将深入解析Airbnb规范的核心要点,带你掌握从环境配置到高级模式的完整实践方案,让你的Node.js项目代码更规范、更易读、更可靠。 ## 为什么选择Airbnb代码规范? Airb

gitblog_01056的博客 1161

Airbnb JavaScript最佳实践:变量声明、提升机制与作用域管理

Airbnb JavaScript Style Guide 中文版是一套广泛采用的JavaScript编码规范,旨在帮助开发者编写更清晰、可维护的代码。本文将深入解析其中关于变量声明、提升机制与作用域管理的核心规则,帮助你避开常见陷阱,提升代码质量。 ## 为什么变量声明规范如此重要? 在JavaScript中,变量声明方式直接影响代码的可读性和运行时行为。Airbnb规范强调严格的变量声明规

gitblog_00495的博客 597

深度解析:JavaScript变量声明的演变与核心差异(var/let/隐式声明)

var:历史产物,存在设计缺陷let/const:现代工程化必备,提供可靠的作用域控制隐式声明:绝对避免的危险模式随着ES模块的普及和TypeScript的兴起,配合const优先原则,开发者可以构建出更健壮、可维护的应用程序。理解变量声明机制的底层原理,是掌握JavaScript执行上下文、闭包等高级概念的重要基础。

airCyan_的博客 765

JavaScript 变量声明关键字

3. const(常量,值不允许修改,推荐优先用)如果 const 存的是对象、数组,里面内容可以改。缺点:容易污染变量,出现意想不到的 bug。2. let(声明可变变量,推荐)需要后期改变值的时候,用 let。存在变量提升,可以先使用再声明。没有变量提升,必须先声明后使用。1. var(旧版,不推荐)块级作用域({ }里面生效)2.可以重复声明同一个变量。尽量不要再使用 var。

2603_96589662的博客 593

javascript 预编译梳理

(javascript 函数 预编译问题详解) js 三部曲 语法分析 -----> 预编译 ------> 解释执行 预编译前奏 function test(){ console.log('a'); } test(); //可以执行 test(); function test(){ console.log('a'); } // 这样也可以执行 就是因为预编译的存在 var a = 123; console.log('a'); 答案:123 con

m0_46232069的博客 167

前端简单的的变量声明

在 ES5 时代只有var来声明变量,存在很多设计缺陷。ES6 新增了let和const,引入块级作用域,解决了var带来的很多 bug。开发中现在基本推荐优先使用letconst,少用或者不用var。下面对比三者核心特点。

qq_63084249的博客 236

JS中var、let和const的区别详解

特性varletconst作用域函数作用域块级作用域块级作用域变量提升是(初始化为undefined)是(存在TDZ)是(存在TDZ)重复声明允许不允许不允许全局对象属性是否否重新赋值允许允许不允许必须初始化否否是默认使用const需要重新赋值时使用let避免使用var掌握这些区别对于编写健壮的JavaScript代码至关重要。

2601_96376625的博客 284
上一篇: webpack基本使用
下一篇: teamviewer 连不上的问题
史蒂芬李
博客等级 码龄14年 7粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值