广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript变量声明的var、let、const详解
  • 699
分享到

JavaScript变量声明的var、let、const详解

2024-04-02 19:04:59 699人浏览 八月长安
摘要

目录前言内容javascript的变量声明var的变量声明变量声明在函数作用域中变量重复声明变量声明提升怪异危险的varlet和const的变量声明块级作用域不可重复声明暂时性死区使

前言

一个程序语言在运行的过程中,变量的声明在整个程序的生命周期中,是不断在进行的过程。任何程序的计算都会涉及至少一个变量,而计算的结果的则可能会涉及到另外的一个或者多个变量。变量在使用前是要声明,变量声明的过程在计算机的底层,牵涉到的是内存空间和内存地址的分配。当然啦,有内存空间的分配,就会有内存空间的回收和再分配。可以看出,变量声明是我们在接触一门程序语言中起始的也是很关键的一步。

而本篇文章想跟大家聊聊的,是关于JavaScript的变量声明中的一些内容。

内容

JavaScript的变量声明

虽然一门语言的语法发展,变量声明的语法和方式通常是比较起始的。程序语言的设计者通常都会在语言的初始的版本尽量根据自己对语言的设计思想,设计好语言的变量声明的语法和方式,以保证好程序语言在未来的很长的道路上有一个比较好的起始。但是,JavaScript却没有一个这么好的起始。

JavaScript的设计之初衷,就是一门为了解决简单的网页互动的脚本语言。它的设计,只用了短短的10天时间。就像初生的婴儿一样,稚嫩而没有太多的规划和愿景。设计者做梦都没有想到,JavaScript将来可以在整个互联网的发展中占有这么大的一个分量,不仅在浏览器端,而且在移动端、APP端、服务端、桌面应用上都扮演着重要的角色。

JavaScript的设计的雏形是稚嫩的,但是随着这么语言逐渐的受到关注和使用,语言本身的设计和语法,也在不断的发展着。而JavaScript的变量声明方式也从野蛮的var的声明方式,前行到了ECMAScript标准的letconst的声明方式。

接下来,我们一起来讨论它们。

var的变量声明

var用于声明一个函数范围或者全局范围的变量,并且可以为其初始化一个值。它是ECMAScript2015之前的变量声明的唯一关键字,曾经承载过一代前端开发者的青葱岁月以及水深火热。它具有如下的特性:

变量声明在函数作用域中

与大多数的语言不同,作为过去的JavaScript的唯一变量声明方式,var的所声明的变量并不是声明在块级作用域中 ,而是声明在最近的函数上下文中,也就是局部函数作用域。对于未在任何函数中声明的变量,其声明范围则是在全局对象global之中。



var globalVar = 'global var';


function f1() {
  
  var localVar1 = 'local var1';
  
  return function f2() {
    
    var localVar2 = 'local var2';
    return localVar2;
  
  }

}

f1();

上面的代码中,globalVar作为定义在全局对象global中的一个全局变量,除了可以直接通过变量标识符globalVar访问到之外,也可以通过global.globalVar或者window.globalVar的对象属性访问方式来访问到。

同时还能看到,上面的作用域定义构建成了一条global -> f1 -> f2的函数作用域链, 函数执行过程中的变量访问会根据这条函数作用域链进行规则查找和访问。

变量重复声明

var的变量声明支持在同一作用域中进行同一个变量的多次重复的声明,多次声明中只有首次的变量声明会被执行,其他声明会因为当前的执行上下文对象中已存在当前变量而被忽略。但是,声明变量同时如果对变量进行了初始赋值,赋值操作依旧会被执行。


var value = 1;


var value = 2;

console.log(value); // 2

变量声明提升

var的变量声明存在“提升”(hoisting)的特性。JavaScript在执行函数代码的前,首先会对函数内当前执行上下文中的所有var的变量声明进行扫描确认,并将所有的声明按顺序提前到当前执行上下文的顶部,也就是函数内的顶部。这种变量声明提升的特性,让我们在同一作用域中的可以直接访问和使用一个在后续的代码才进行了首次变量声明的变量,即在变量声明之前使用变量。

虽然,变量的声明在执行时被提升了,但是,变量声明中的初始赋值操作却并没有被提升,从而形成一种声明和初始赋值的执行逻辑上的割裂。也就是说,即使我们可以直接访问和使用在后续的代码才被声明和赋值的变量,然而,变量的值却是undefined。代码一直执行到声明和初始赋值语句后,变量的值才会被赋值为它的初始赋值。


console.log(value); // undefined


var value = 1;

console.log(value); // 1

怪异危险的var

var的这些的怪异的特性,虽然在程序上都属于合法可运行,但是,对于编写程序的人来说,有着许多有违正常逻辑的地方,而且容易造成代码调试的困难。例如:面对变量的声明和管理,我们不得不以函数为基本的管理区进行管理;对变量的重复声明,让我们对代码从上而下的变量的安全访问和变量值的确认变得不容易控制;

虽然,为了防止这些危险的出现,我们可以通过编程习惯的方式来进行约束。但是,这些终究只是软约束,随着JavaScript的不断发展和使用来构建复杂的应用,这些约束就愈加捉襟见肘。

let和const的变量声明

黑暗和混沌,终于迎来了曙光的到来。ECMAScript2015的到来,就像一束光辉照耀进来,给JavaScript变量声明这一块带来了翻天覆地的变化。不仅带来了letconst这两个新的变量声明关键字,而且还直接一跃变成了最佳的变量声明方式。

而这些惊天动地变化的出现都是因为,相对于varletconst带来了如下新的共同特征:

块级作用域

letconst关键字带给我们的第一个让人兴奋的特性就是块级作用域。苦于之前var关键字的基于函数作用域的特性,我们不得在函数范围内小心的定义变量名称和使用变量,特别是在条件判断和循环逻辑中,甚至不得不在循环中使用上立即执行函数来进行变量值的读取和保存。

function f() {
  
  for (var i = 0; i < 5; i++) {
    setTimeout(() => { console.log(i); });
  }
    
  
  for (var i = 0; i < 5; i++) {
    (function(i) {
      setTimeout(() => { console.log(i); }, 0);
    })(i);
  }
}

f();

现在,我们可以通过花括号{}以及letconst关键词声明限制于块级作用域中的变量了。if块、while块、function块甚至单独的{}都是良好的块级作用域声明区块。还有一点,相对于var,在全局作用域中使用letconst声明的变量并不会添加到全局上下文对象global中。综合看来,块级作用域的特性使我们的变量的声明和使用更加的简洁和安全。


for (let i = 0; i < 5; i++) {
  setTimeout(() => { console.log(i); }, 0);
}

if (true) {
  let a = 1;
}

console.log(a); // ReferenceError


let b = 1;
console.log(window.b); // undefined

不可重复声明

相比于var的重复声明会被忽略,letconst在同一作用域中对同一标识符的变量不能重复声明。这种变量声明执行上的约束,避免了同作用域下不同位置的变量声明冲突,消除了许多不容易预见的运行问题,让JavaScript在构建复杂应用中的变量声明过程变得更加的安全。

let a = 1;
{
  
  let a = 1;
}

let a = 1; // SyntaxError

暂时性死区

相对于var的变量声明提前导致的变量在函数作用域中可以“先使用后声明”的现象。letconst关键字声明的变量也具有执行中变量声明提前的特性,但是却不能在变量完成声明之前进行访问和修改,否则会抛出ReferenceError的错误。

这种变量声明所绑定的块级作用域的顶部,一直到变量声明语句执行完成之前的,变量不能访问和修改的区域,称为这个变量的暂时性死区(TDZ,temporal dead zone)。暂时性死区的引入,在代码执行上约束了变量必须遵循“声明后才能使用”的原则,使JavaScript的变量声明和使用更加安全和具有更好的可读性。

{
  
  
  console.log(b); // ReferenceError
  let a = 1;
  
  let b = 2;
  
  console.log(a); // 1
}

值得注意的是,暂时性死区是基于执行顺序(时间)上的,而不是编写代码顺序(位置)上的。只要变量的访问和修改的代码的执行,是在变量声明之后,就是合法的。

{
  
  function f() {
    console.log(value);
  }

  

  let value = 1;
  
  
  f(); // 1
}

使用好let和const

letconst两者的这些新的共同特性,让它们直接变成了变量声明的最佳方式和实践。但是,两者的除了上面说道的共同特性,还存在一个两者的差异。

简单来说,letconst的区别在于,let用于声明基于块级作用域的变量,而const用于声明基于块级作用域的常量。

  • 使用let声明的变量,在变量的整个生命周期中,能够对变量随时进行赋值修改。
  • 使用const声明的变量为引用常量,必须在声明的同时进行初始赋值,在变量的整个生命周期中,无法再通过赋值的方式来修改变量值。

const的这个无法再赋值的特性,在不同的变量类型下会有不同的表现:

  • 如果const声明并且初始化赋值是基础数据类型变量(StringNumberBooleanSymbol),那么该变量之后就不能再进行任何值的修改了。因为基础数据类型变量的值必须通过变量赋值来进行修改。
  • 如果const声明并且初始化赋值是引用数据类型变量(ArrayObjectMapSet),那么我们则可以随意对该变量的字段属性进行修改。因为引用数据类型变量的内容修改(新增、修改、删除属性)并不会出现所声明变量的赋值操作.

let value1 = 1;
value1 = 2;


const value2; // SyntaxError


const value3 = 3;
value3 = 4 // TypeError


const value4 = {
  key1: 1,
  key2: 2,
};
value4.key = 3;

在实践中,我们应该尽可能的多使用const进行变量声明,当确定一个变量需要重新赋值的时候才将其改用let进行声明,这样可以让我们对程序执行中的可能发生重新赋值的变量有一个清晰的了解,减少可能出现的bug。

总结

ECMAScript2015带来了letconst这两个新的变量声明关键字,带来了块级作用域和暂时性死区等新特性,解决过去var的变量声明中的一些怪异问题,在语法层面和运行层面上,保证了变量声明的“声明后才可以使用”的安全特性,提高了JavaScript在编写大型应用时的变量声明和使用安全。

当前,letconst已经是我们日常开发中的变量声明的最佳时间方式。了解它们,才能用好它们。

参考资料

  • 《JavaScript高级程序设计》
  • 《你不知道的JavaScript》
  • MDN

到此这篇关于JavaScript变量声明的var、let、const详解的文章就介绍到这了,更多相关js变量声明var、let、const内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript变量声明的var、let、const详解

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

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

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

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

下载Word文档
猜你喜欢
  • JavaScript变量声明的var、let、const详解
    目录前言内容JavaScript的变量声明var的变量声明变量声明在函数作用域中变量重复声明变量声明提升怪异危险的varlet和const的变量声明块级作用域不可重复声明暂时性死区使...
    99+
    2022-11-13
  • javascript 变量声明 var,let,const 的区别
    目录作用域(Scope)是什么var 声明提升(Hoisting)let 声明const 声明作用域(Scope)是什么 作用域是程序的执行环境,它包含在当前位置可访问的变量和函数。...
    99+
    2022-11-13
  • JavaScript声明变量的这四兄弟(var、let、function、const)
    四兄弟的背景 在一个名为编程语言的村庄里,有不同姓氏的村民。例如Java、Python、Golang、JavaScript等姓氏,而接下来要介绍的就是JavaScript这个姓氏的一...
    99+
    2023-02-13
    JavaScript声明变量 js声明变量
  • javascript变量声明var,let,const的区别是什么
    本文小编为大家详细介绍“javascript变量声明var,let,const的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“javascript变量声明var,let,const的区别是什么”文章能帮助大家解决疑惑,下面跟着小...
    99+
    2023-06-30
  • JavaScript变量中var,let和const的区别
    目录前言ES5与ES6的区别1. 作用域2. 全局属性3. 变量提升与暂时性死区4. 重复声明let与const的区别1. 常量最佳实践前言 JavaScript中一共有3种用来声明...
    99+
    2022-11-13
  • javascript中var与let、const的区别详解
    一、var声明的变量会挂载在window上,而let和const声明的变量不会: var a = 100; console.log(a,window.a); // 100 10...
    99+
    2022-12-23
    javascript中var与let const的区别详解 var let const区别
  • javascript的var与let,const之间的区别详解
    目录作为全局变量时变量提升暂时性死区块级作用域重复声明修改声明的变量(常量与变量声明)总结说到JavaScript中声明变量的几种方法也就是var、let、const了,let和co...
    99+
    2022-11-12
  • JavaScript变量or循环中的var和let详解
    目录在for循环中使用var声明初始化带来的问题解决方法使用闭包使用let变量初始化for循环怎么处理用let和var声明的初始化变量?总结在for循环中使用var声明初始化带来的问...
    99+
    2022-11-13
  • JavaScript如何使用let声明变量
    这篇文章将为大家详细讲解有关JavaScript如何使用let声明变量,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用let声明变量使用 let 可以声明块级别作用域的...
    99+
    2022-10-19
  • JavaScript如何使用const声明变量
    这篇文章主要介绍JavaScript如何使用const声明变量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用const声明变量使用 var 和 let 声明的变量在脚本代码的运行...
    99+
    2022-10-19
  • javascript变量声明是否必须用var
    这篇文章将为大家详细讲解有关javascript变量声明是否必须用var,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。javascript中,变量声明不是必须用var,还...
    99+
    2022-10-19
  • javascript使用var声明变量的问题怎么解决
    这篇文章主要介绍了javascript使用var声明变量的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript使用var声明变量的问题怎么解决文章都会...
    99+
    2022-10-19
  • javascript声明变量不用var的方法有哪些
    本篇内容主要讲解“javascript声明变量不用var的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript声明变量不用var的方法有...
    99+
    2022-10-19
  • JavaScript es6中var、let以及const三者区别案例详解
    首先,一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?         ECMAScript是一个国际通过的...
    99+
    2022-11-12
  • 深入了解JavaScript中let/var/function的变量提升
    目录前言1. let存在提升2. var/function的变量提升2.1 var的变量提升2.2 function的变量提升3. 总结前言 在我们的印象中,当提到JavaScrip...
    99+
    2022-11-13
  • javascript中使用let声明变量的优势有哪些
    这篇文章主要介绍了javascript中使用let声明变量的优势有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript中使用let声明变量的优势有哪些文章都会...
    99+
    2022-10-19
  • JavaScript三大变量声明详析
    目录前言Var基础写法声明未定义值声明定义值不推荐写法var 声明作用域局部作用域全局作用域便捷语法var 声明提升Letlet 作用域冗余声明暂时性死区全局声明条件声明for&nb...
    99+
    2022-11-13
  • JavaScript中const声明变量哪些类型可以被更改
    这篇文章给大家分享的是有关JavaScript中const声明变量哪些类型可以被更改的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。const 声明变量哪些类型可以被更改如果值不想被改变时,可以使用 const:c...
    99+
    2023-06-27
  • JavaScript变量or循环中的var和let怎么使用
    这篇“JavaScript变量or循环中的var和let怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面...
    99+
    2022-10-19
  • JavaScript中的变量声明怎么理解
    这篇文章的内容主要围绕JavaScript中的变量声明怎么理解进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!变量ECMAScript中,变量可以保存...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作