瞭解JS中的var、let和const

2020-10-20 21:01:19

本篇文章給大家介紹一下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中的var、let和const的詳細內容,更多請關注TW511.COM其它相關文章!