了解JS中的var、let和const

青灯夜游
发布: 2020-10-20 17:13:25
转载
2488 人浏览过

了解JS中的var、let和const

本篇文章给大家介绍一下JavaScript 的 var,let 和 const,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

var

var语句用来在 JavaScript 中声明一个变量,该变量遵守以下规则:

  • 作用域范围是函数作用域或全局作用域的。
  • 不受暂存死区(TDZ)的限制。
  • 它会在window上以相同的名称创建一个全局属性。
  • 可分配的
  • 可声明的

函数作用域和全局作用域

当出现在全局作用域内时,var创建一个全局变量。另外它还会在window上创建一个具有相同名称的全局属性

var city = "Florence"; console.log(window.city); // "Florence"
登录后复制

当在函数内部声明时,变量的作用域为该函数:

var city = "Florence"; function bubble() { var city = "Siena"; console.log(city); } bubble(); // "Siena" console.log(city); // "Florence"
登录后复制

var声明会被提升:

function bubble() { city = "Siena"; console.log(city); var city; // hoists } bubble(); // "Siena"
登录后复制

意外的全局变量

在没有任何声明的情况下所分配的变量(无论是varlet还是const)在默认情况下会成为全局变量

function bubble() { city = "Siena"; console.log(window.city); } bubble(); // "Siena"
登录后复制

为了消除这种行为,需要使用严格模式

"use strict"; function bubble() { city = "Siena"; console.log(window.city); } bubble(); // ReferenceError: assignment to undeclared variable city
登录后复制

可重新分配和重新声明

任何用var声明的变量都可以在以后进行重新分配重新声明。重新声明的例子:

function bubble() { var city = "Florence"; var city = "Siena"; console.log(city); } bubble(); // "Siena"
登录后复制

重新分配的例子:

function bubble() { var city = "Siena"; city = "Florence"; console.log(city); } bubble(); // "Florence"
登录后复制

let

let语句在 JavaScript 中声明一个变量,该变量遵守以下规则:

  • 属于块作用域。
  • 受到暂存死区的约束。
  • 它不会在window上创建任何全局属性。
  • 可分配的
  • 不可重新声明

块作用域

let声明的变量不会在window上创建任何全局属性:

let city = "Florence"; console.log(window.city); // undefined
登录后复制

当在函数内部声明时,变量的作用域为该函数:

let city = "Florence"; function bubble() { let city = "Siena"; console.log(city); } bubble(); // "Siena" console.log(city); // "Florence"
登录后复制

当在中声明时,变量的作用域为该块。以下是在块中使用的例子:

let city = "Florence"; { let city = "Siena"; console.log(city); // "Siena"; } console.log(city); // "Florence"
登录后复制

一个带有if块的例子:

let city = "Florence"; if (true) { let city = "Siena"; console.log(city); // "Siena"; } console.log(city); // "Florence"
登录后复制

相反,var并不受到块的限制:

var city = "Florence"; { var city = "Siena"; console.log(city); // "Siena"; } console.log(window.city); // "Siena"
登录后复制

暂存死区

let声明可能会被提升,但是会产生暂存死区

function bubble() { city = "Siena"; console.log(city); // TDZ let city; } bubble(); // ReferenceError: can't access lexical declaration 'city' before initialization
登录后复制

暂存死区可防止在初始化之前访问let声明。另外一个例子:

function bubble() { console.log(city); // TDZ let city = "Siena"; } bubble(); // ReferenceError: can't access lexical declaration 'city' before initialization
登录后复制

可以看到两个例子中产生的异常都是一样的:证明了“暂存死区”的出现。

可重新分配,不可重新声明

任何用let声明的变量都不能重新声明。重新声明引发异常的例子:

function bubble() { let city = "Siena"; let city = "Florence"; console.log(city); } bubble(); // SyntaxError: redeclaration of let city
登录后复制

这是一个有效的重新分配的例子:

function bubble() { let city = "Siena"; city = "Florence"; console.log(city); } bubble(); // "Florence"
登录后复制

const

const语句用来在 JavaScript 中声明一个变量,该变量遵守以下规则:

  • 是属于块作用域的。
  • 受到“暂存死区”的约束。
  • 它不会在window上创建任何全局属性。
  • 不可重新分配
  • 不可重新声明

块作用域

用 const 声明的变量不会在window上创建任何全局属性:

const city = "Florence"; console.log(window.city); // undefined
登录后复制

当在函数内部声明时,变量的作用域为该函数:

const city = "Florence"; function bubble() { const city = "Siena"; console.log(city); } bubble(); // "Siena" console.log(city); // "Florence"
登录后复制

当在中声明时,变量的作用域为该块。块语句{}的例子:

const city = "Florence"; { const city = "Siena"; console.log(city); // "Siena"; } console.log(city); // "Florence"
登录后复制

if块中的例子:

const city = "Florence"; if (true) { const city = "Siena"; console.log(city); // "Siena"; } console.log(city); // "Florence"
登录后复制

暂存死区

const声明可能会被提升,但是会进入暂存死区

function bubble() { console.log(city); const city = "Siena"; } bubble(); // ReferenceError: can't access lexical declaration 'city' before initialization
登录后复制

不可重新分配,不可重新声明

const声明的任何变量都不能重新声明,也不能重新分配。 一个在重新声明时抛出异常的例子:

function bubble() { const city = "Siena"; const city = "Florence"; console.log(city); } bubble(); // SyntaxError: redeclaration of const city
登录后复制

重新分配的例子示例:

function bubble() { const city = "Siena"; city = "Florence"; console.log(city); } bubble(); // TypeError: invalid assignment to const 'city'
登录后复制

总结


块作用域 暂存死区 创建全局属性 可重新分配 可重新声明
var
let
const

英文原文地址:https://www.valentinog.com/blog/var/

作者:Valentino

相关免费学习推荐:js视频教程

以上是了解JS中的var、let和const的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:segmentfault.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!