JavaScript變數聲明var,let.const

来源:https://www.cnblogs.com/sugarbean/archive/2018/04/22/8870915.html
-Advertisement-
Play Games

var聲明變數的作用域限制在其聲明位置的上下文中 let 聲明的變數只在其聲明的塊或子塊中可用,var的作用域是整個封閉函數 在 ECMAScript 2015 中,let綁定不受變數提升的約束,這意味著let聲明不會被提升到當前執行上下文的頂部。 在塊中的變數初始化之前,引用它將會導致 Refer ...


var聲明變數的作用域限制在其聲明位置的上下文中

var x = 0;  // x是全局變數,並且賦值為0。

console.log(typeof z); // undefined,因為z還不存在。

function a() { // 當a被調用時,
  var y = 2;   // y被聲明成函數a作用域的變數,然後賦值成2。

  console.log(x, y);   // 0 2 

  function b() {       // 當b被調用時,
    x = 3;  // 全局變數x被賦值為3,不生成全局變數。
    y = 4;  // 已存在的外部函數的y變數被賦值為4,不生成新的全局變數。
    z = 5;  // 創建新的全局變數z,並且給z賦值為5。 
  }         // (在嚴格模式下(strict mode)拋出ReferenceError)

  b();     // 調用b時創建了全局變數z。
  console.log(x, y, z);  // 3 4 5
}

a();                   // 調用a時同時調用了b。
console.log(x, z);     // 3 5
console.log(typeof y); // undefined,因為y是a函數的本地(local)變數。

let 聲明的變數只在其聲明的塊或子塊中可用,var的作用域是整個封閉函數

function varTest() {
  var x = 1;
  if (true) {
    var x = 2;  // 同樣的變數!
    console.log(x);  // 2
  }
  console.log(x);  // 2
}

function letTest() {
  let x = 1;
  if (true) {
    let x = 2;  // 不同的變數
    console.log(x);  // 2
  }
  console.log(x);  // 1
}

在 ECMAScript 2015 中,let綁定不受變數提升的約束,這意味著let聲明不會被提升到當前執行上下文的頂部。

在塊中的變數初始化之前,引用它將會導致 ReferenceError(而使用 var 聲明變數則恰恰相反,該變數的值是 undefined

當在塊中使用時,let將變數的作用域限製為該塊。註意var的作用域在它被聲明的函數內的區

var a = 1;
var b = 2;

if (a === 1) {
  var a = 11; // the scope is global
  let b = 22; // the scope is inside the if-block

  console.log(a);  // 11
  console.log(b);  // 22
} 

console.log(a); // 11
console.log(b); // 2

const 常量必須在聲明的同時指定它的值.

const聲明創建一個值的只讀引用。但這並不意味著它所持有的值是不可變的(如引用內容是對象),只是變數標識符不能重新分配

一個常量不能和它所在作用域內的其他變數或函數擁有相同的名稱

// 註意: 常量在聲明的時候可以使用大小寫,但通常情況下全部用大寫字母。 

// 定義常量MY_FAV並賦值7
const MY_FAV = 7;

// 報錯
MY_FAV = 20;

// 輸出 7
console.log("my favorite number is: " + MY_FAV);

// 嘗試重新聲明會報錯 
const MY_FAV = 20;

//  MY_FAV 保留給上面的常量,這個操作會失敗
var MY_FAV = 20; 

// 也會報錯
let MY_FAV = 20;

// 註意塊範圍的性質很重要
if (MY_FAV === 7) { 
    // 沒問題,並且創建了一個塊作用域變數 MY_FAV
    // (works equally well with let to declare a block scoped non const variable)
    let MY_FAV = 20;

    // MY_FAV 現在為 20
    console.log('my favorite number is ' + MY_FAV);

    // 這被提升到全局上下文並引發錯誤
    var MY_FAV = 20;
}

// MY_FAV 依舊為7
console.log("my favorite number is " + MY_FAV);

// 常量要求一個初始值
const FOO; // SyntaxError: missing = in const declaration

// 常量可以定義成對象
const MY_OBJECT = {"key": "value"};

// 重寫對象和上面一樣會失敗
MY_OBJECT = {"OTHER_KEY": "value"};

// 對象屬性並不在保護的範圍內,下麵這個聲明會成功執行
MY_OBJECT.key = "otherValue";

// 也可以用來定義數組
const MY_ARRAY = [];
// It's possible to push items into the array
// 可以向數組填充數據
MY_ARRAY.push('A'); // ["A"]
// 但是,將一個新數組賦給變數會引發錯誤
MY_ARRAY = ['B']

以上內容摘錄MDN Web文檔  未完待續

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Android的擴展工程包含在external文件夾中,這是一些經過修改後適應Android系統的開源工程,這些工程有些在主機上運行,有些在目標機上運行; (主機)ext2文件系統生成工具 ...
  • 一、Android中的緩存策略 一般來說,緩存策略主要包含緩存的添加、獲取和刪除這三類操作。如何添加和獲取緩存這個比較好理解,那麼為什麼還要刪除緩存呢?這是因為不管是記憶體緩存還是硬碟緩存,它們的緩存大小都是有限的。當緩存滿了之後,再想其添加緩存,這個時候就需要刪除一些舊的緩存並添加新的緩存。 因此L ...
  • 先展示一下四種對話框的效果圖: 普通對話框 單選對話框: 多選對話框: 進度條對話框: 一個簡單的佈局,放四個按鈕: 四種對話框: ...
  • UIImage* img=[UIImage imageNamed:@"name.png"];//原圖 UIEdgeInsets edge=UIEdgeInsetsMake(0, 10, 0,10); //UIImageResizingModeStretch:拉伸模式,通過拉伸UIEdgeInsets... ...
  • 之前做過一版h5微信聊天移動端,這段時間閑來無事就整理了下之前項目,又重新在原先的那版基礎上升級了下,如是就有了現在的h5仿微信聊天高仿版,新增了微聊、通訊錄、探索、我四個模塊 左右觸摸滑屏切換,聊天頁面優化了多圖預覽、視頻播放,長按菜單UI,聊天底部編輯器重新優化整理(新增多表情),彈窗則用到了自 ...
  • 原文摘自:https://www.cnblogs.com/moqiutao/archive/2015/12/23/5070463.html 總節: 1) 定義字體標準格式: 2)字體轉換網址: http://www.freefontconverter.com/https://everythingfo ...
  • 最近因為工作關係,一直在做node.js的開發,學習了koa框架,orm框架sequelize,以及swagger文檔的配置。但是,最近因為swagger文檔使用了es6的修飾器那麼個東西(在java中被稱作註解),所以,node.js無法編譯項目,所以就需要使用babel對es6進行轉換。因為這篇 ...
  • <!DOCTYPE html><html xmlns="http://www.w3.org/1999/html"><head lang="en"> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="../css/r ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...