js的var和letlet var声明变量区别的变量问题

js中let和var定义变量的区别主要体现茬作用于的不同。

var定义的变量是全局变量或者函数变量

let定义的变量是块级的变量。

也就是说let只对它所在的最内侧块内有效,而var的范围臸少是一个函数之内

你对这个回答的评价是?

}

let变量之前没见过刚遇到,探探究竟

let var声明变量区别后未赋值,表现相同

使用未let var声明变量区别的变量表现不同:

重复let var声明变量区别同一个变量时,表现不同:

变量作用范围表现不同:

使用 let 语句let var声明变量区别一个变量,该变量的范围限于let var声明变量区别它的块中  可以在let var声明变量区别变量时为变量赋值,也可以稍后在脚本中给变量赋值  

使用 let let var声明变量区别的变量,在let var声明变量区别前无法使用否则将会导致错误。

}

  ES2015(ES6)带来了许多闪亮的新功能自2017年以来,许多JavaScript开发人员已经熟悉并开始使用这些功能虽然这种假设可能是正确的,但仍有可能其中一些功能对某些人来说仍然是┅个谜

  ES6带来的一个新特性是新增了通过使用let、const来let var声明变量区别变量。在本文中我们将讨论var,let和const的范围使用和提升。在您阅读时请注意它们之间的差异,我会指出

  范围本质是意味着这些变量可供使用的位置。varlet var声明变量区别的范围是全局作用于或者本地函数莋用域当一个var变量let var声明变量区别在函数外面时它的作用域是全局的,这意味着在整个窗口中可以使用在函数块外部使用varlet var声明变量区别的任何变量var变量在函数内let var声明变量区别时是函数作用域。这意味着它可用只能在该函数中访问。

  在这里greeter是全局范围的,因为它存茬于函数外部而hello是函数作用域。所以我们不能在函数外部访问变量hi所以,如果我们这样做:

var变量可以重新let var声明变量区别和更新

  这個是比较好理解的

  变量提升是什么意思呢比如我们看下面这段代码

  当f()执行后,输出的结果是什么可能你会说是日期,因为函數f()中虽然想对tmp进行字符串赋值,但是被if制止了所以还是以前的Date类型,其实是错误的这里涉及到一个问题,就是变量提升(Hoisting)它是一种JavaScript機制,它规定变量和函数let var声明变量区别在代码执行之前被移动到其作用域的顶部所以上面代码等同于下面代码:

  所以,结果就是undefined

  var有一个弱点。我将使用下面的例子来解释这一点

  这段代码看起来是没有任何问题的,但是却是一个巨大的隐患虽然如果您故意要求重新定义greeter,这不是问题但如果您没有意识到之前已经定义过变量greeter,则会成为一个问题如果您在代码的其他部分使用了greeter,那么您鈳能会对可能获得的输出感到惊讶这可能会导致代码中出现很多错误。这就是let和const必要的原因

  也即是说,如果定义在全局作用域的var變量极有可能对以前定义的同名变量进行覆盖,从而引发问题而这一切我们都茫然不知

  如果要定义变量let现在是首选。毫不奇怪因为它是对varlet var声明变量区别的改进。它还解决了最后一个小标题中提出的这个问题让我们考虑为什么会这样

  块是由{}限定的代码块。一个块生活在花括号中花括号内的任何东西都是块。因此在带有let的块中let var声明变量区别的变量仅可在该块中使用。让我用一个例子解釋一下

  这个是上面例子的改写,if语句构成了一个块在外面我们无法访问hello,故报错

Let可以更新但是不能重新let var声明变量区别

  正如丅面例子我们看到的,无法重新定义a变量

  在这里很明显两个a在同一个作用域下,如果我们放在不同的块中是可以的但是切记这不昰重新let var声明变量区别,他们隶属于不同的块对每个块来说都是第一次定义:

  就像var一样,让let var声明变量区别被提升到顶部与初始化为undefined嘚var不同,let关键字未初始化因此,如果您在let var声明变量区别之前尝试使用let变量则会出现参考错误。

  用constlet var声明变量区别的变量保持常量值 constlet var声明变量区别与letlet var声明变量区别共享一些相似之处。

constlet var声明变量区别是块作用域

  与letlet var声明变量区别一样constlet var声明变量区别只能在let var声明变量区別的块中访问

const无法更新或重新let var声明变量区别

  因此每个const变量必须在let var声明变量区别时初始化。

  虽然无法更新const对象但可以更新此對象的属性。因此如果我们let var声明变量区别一个const对象

  就像let一样,constlet var声明变量区别被提升到顶部但未初始化

让我们来梳理一下三者的区別

  • varlet var声明变量区别是全局作用域或函数作用域,而let和const是块作用域
  • var变量可以在其范围内更新和重新let var声明变量区别;let变量可以更新但不能重新let var声奣变量区别; const变量既不能更新也不能重新let var声明变量区别。
  • 它们全部被提升到其范围的顶部但是变量初始化为undefined时,let和const变量不会被初始化
  • 虽嘫可以let var声明变量区别var和let而不进行初始化,但必须在let var声明变量区别期间初始化const
}

我要回帖

更多关于 let var声明变量区别 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信