js變數的作用域、變數的提升、函數的提升

来源:https://www.cnblogs.com/yanjijiang/archive/2019/08/03/11294727.html
-Advertisement-
Play Games

變數的作用域在函數之外聲明的變數,叫做全局變數,因為它可被當前文檔中的任何其他代碼所訪問。在函數內部聲明的變數,叫做局部變數,因為它只能在當前函數的內部訪問。 ECMAScript 6 之前的 JavaScript 沒有 語句塊作用域;相反,語句塊中聲明的變數將成為語句塊所在函數(或全局作用域)的局 ...


變數的作用域
在函數之外聲明的變數,叫做全局變數,因為它可被當前文檔中的任何其他代碼所訪問。在函數內部聲明的變數,叫做局部變數,因為它只能在當前函數的內部訪問。

ECMAScript 6 之前的 JavaScript 沒有 語句塊作用域;相反,語句塊中聲明的變數將成為語句塊所在函數(或全局作用域)的局部變數。例如,如下的代碼將在控制台輸出 5,因為 x 的作用域是聲明瞭 x 的那個函數(或全局範圍),而不是 if 語句塊。

if (true) {
var x = 5;
}
console.log(x); // 5
如果使用 ECMAScript 6 中的 let 聲明,上述行為將發生變化。

if (true) {
let y = 5;
}
console.log(y); // ReferenceError: y 沒有被聲明
變數提升
JavaScript 變數的另一個不同尋常的地方是,你可以先使用變數稍後再聲明變數而不會引發異常。這一概念稱為變數提升;JavaScript 變數感覺上是被“提升”或移到了函數或語句的最前面。但是,提升後的變數將返回 undefined 值。因此在使用或引用某個變數之後進行聲明和初始化操作,這個被提升的變數仍將返回 undefined 值。

/**
* 例子1
*/
console.log(x === undefined); // true
var x = 3;


/**
* 例子2
*/
// will return a value of undefined
var myvar = "my value";

(function() {
console.log(myvar); // undefined
var myvar = "local value";
})();
上面的例子,也可寫作:

/**
* 例子1
*/
var x;
console.log(x === undefined); // true
x = 3;

/**
* 例子2
*/
var myvar = "my value";

(function() {
var myvar;
console.log(myvar); // undefined
myvar = "local value";
})();
由於存在變數提升,一個函數中所有的var語句應儘可能地放在接近函數頂部的地方。這個習慣將大大提升代碼的清晰度。

在 ECMAScript 6 中,let(const)將不會提升變數到代碼塊的頂部。因此,在變數聲明之前引用這個變數,將拋出引用錯誤(ReferenceError)。這個變數將從代碼塊一開始的時候就處在一個“暫時性死區”,直到這個變數被聲明為止。

console.log(x); // ReferenceError
let x = 3;
函數提升
對於函數來說,只有函數聲明會被提升到頂部,而函數表達式不會被提升。

/* 函數聲明 */

foo(); // "bar"

function foo() {
console.log("bar");
}


/* 函數表達式 */

baz(); // 類型錯誤:baz 不是一個函數

var baz = function() {
console.log("bar2");
};

 

本文引自:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types#Unicode.E7.BC.96.E7.A0.81


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

-Advertisement-
Play Games
更多相關文章
  • 眾所周知, iOS開發找工作越來越難, 企業要求越來越高,一方面是資本寒冬期+七八月是企業招人淡季, 另外一方面也是iOS市場飽和。最近有出去看新機會, 所以下麵記錄一下麵試XimalayaFM的大概過程。 面試一共分為4輪,全程手寫代碼和演算法。 一面:自我介紹, 然後問一下手頭開發App日活和崩潰 ...
  • 在網路中,數據交互通常是以XML和Json的格式進行,所以對這兩種格式的數據進行解析,是Android開發中的必備功能,本文以一個簡單的小例子,簡述Android開發中Xml和Json解析的常用方式,僅供學習分享使用。 ...
  • #0x00 前言 安卓應用加固技術是伴隨安卓應用破解技術一同發展起來的。加固技術分為加殼保護和反反彙編保護技術。市面上成熟的加固廠商一般會使用加殼保護技術配合反反彙編技術對安卓應用進行加固。 安卓反反彙編技術的總結在我另一篇博客中將進行詳細探討,鏈接: http://................ ...
  • 記錄一下我前段時間封裝的一個vue組件吧。技術需要積累,有時間我把我之前寫的還不錯的組件都開源出來。並嘗試vue和react 兩種方式的組件封裝。今天簡單寫下滑鼠框選div選中效果的封裝吧。 div框選實現 div框選效果,其實沒有什麼好的方法,就是獲取滑鼠事件,根據滑鼠的位置,動態創建一個跟隨滑鼠 ...
  • 說起網站調試,pc頁面和h5頁面,假如電腦上能夠重現的,都不在話下,調試起來都蠻簡單。僅僅需要fiddler一個抓包工具,把線上壓縮代碼替換成本地無壓縮代碼就可以了。具體步驟我後面可以詳細介紹。但是,僅僅是某款手機重現,其他手機沒有問題的情況下如何調試?hybrid頁面如何調試呢?這篇文章簡單總結下 ...
  • 特色:寫法更加優雅,更加像面像對象的編程,其思想和 ES5 是一致的。 箭頭函數、this ES6中可以使用 => 作為函數表達形式,極簡風格,參數+ => +函數體。 var foo = function(){return 1;}; //等價於 let foo = () => 1; let num ...
  • HTML屬性 屬性 描述 class 為html元素定義一個或多個類名(classname)(類名從樣式文件引入) id 定義元素的唯一id style 規定元素的行內樣式(inline style) title 描述了元素的額外信息 (作為工具條使用) HTML <head> 元素 <head> ...
  • 首先來瞄一下background-clip,這個屬性是幹嘛的? 顧名思義,背景裁剪... 按照我自己的理解就是背景的顯示區域 此處粘上MDN的示例鏈接(嫌麻煩的,後面我也貼上截圖)https://developer.mozilla.org/zh-CN/docs/Web/CSS/background- ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...