變數名提升

来源:http://www.cnblogs.com/ghlucky/archive/2016/08/05/5742986.html
-Advertisement-
Play Games

名字的聲明就是讓我的解釋器知道有這個名字 名字沒有任何數據與之對應 函數聲明包含兩部分 首先告訴解釋器函數的名字 告訴解釋器 這個名字對應的函數體是什麼 函數聲明與函數表達式有區別,函數聲明是單獨寫在一個結構中,不存在任何語句,邏輯判斷等結構中 ``` 函數聲明: function(){} func ...


  1. 預解析的過程
  2. 代碼的執行過程 程式在執行過程,會先將代碼讀取到記憶體中檢查,會將所有的聲明在此時進行標記。所謂的標記就是讓js解釋器直到有這個名字,後面在使用名字的時候,不會出現未定義的錯誤,這個標記就是提升 聲明:
  3. 名字的聲明,標識符的聲明(變數名的提升)
    • 名字的聲明就是讓我的解釋器知道有這個名字
    • 名字沒有任何數據與之對應
  4. 函數的聲明
    • 函數聲明包含兩部分
      • 首先告訴解釋器函數的名字
      • 告訴解釋器 這個名字對應的函數體是什麼
    • 函數聲明與函數表達式有區別,函數聲明是單獨寫在一個結構中,不存在任何語句,邏輯判斷等結構中 ``` 函數聲明: function(){} function f(){}
```
 函數表達式:
    var f=function(){};
    this.sayHello=function(){};
    if(true){
        function f(){}
    }

代碼分析:

案例1:

    var num=1;
    function num(){
        alert(num);
    }
    num();
  1. 預解析過程
    • 提升聲明 變數num
    • 再提升函數 num在記憶體中已經存在,因此直接綁定對應的函數體
    • 記憶體中有一個函數num
  2. 執行代碼
    • 給num賦值為1,覆蓋函數
  3. 調用num 由於num中存儲的是數字1 因此報錯

案例2:

    var num=123;
    function foo1(){
        console.log(num);
        var num=456;
        console.log(num);
    }
    foo1();

代碼分析:

  1. 預解析過程
    • 提升變數名num和函數foo1
  2. 執行代碼
    • 給num賦值為123
    • 調用函數
      • 進入函數的瞬間預解析,提升變數名num
      • 在函數內部是一個獨立的空間,允許使用外部的變數即num覆蓋外面的num
      • 執行第一句 輸出為Undefined
      • 執行第二句 給num賦值為456
      • 執行第三句 輸出為456

案例3:

    if(true){
        function f1(){
            console.log('true');
        }
    }else{
        function f1(){
           console.log('false');
        }
    }
    f1();

代碼分析:

  1. 預解析過程
    • 函數在判斷語句中為表達式所以不提升
  2. 執行代碼
    • 執行if語句,條件成立,輸出true
    • 但是一些老版本在執行過程中,會把If語句中的函數表達式當成函數聲明來解析, 並提升函數輸出為false*

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

-Advertisement-
Play Games
更多相關文章
  • 錯誤的例子: 以上代碼執行起來是有錯誤的,因為show(certid.value)這句,直接就執行了show方法,而沒有正確把這個方法對象賦給btn.onclick事件. 正確的方式有: 缺陷:但是這樣無法傳值的! 最好可以改成這樣: 這樣就實現了動態給onclick事件句柄賦值,並支持參數的傳遞! ...
  • [1]屬性查詢 [2]屬性設置 [3]屬性刪除 [4]屬性繼承 ...
  • 今天準備分享一個小知識點,就是確認登錄界面 <body > <form> 輸入戶名: <input type="text" name="name"/> <P>輸入密碼: <input type="password" name="pw" id="pw1"/></P> <p>確認密碼: <input t ...
  • jQuery的toggle()方法應該是在滑鼠點擊後才會觸發,現在的問題是在ready載入後就自動觸發了,怎麼回事呢? 答案是jQuery的版本問題,在1.9以後的版本toggle()就存在這個問題,用之前的版本就正常了。​ 如果你非常喜歡這個功能,有2個辦法,一個辦法是jquery官網提供的一個版 ...
  • 先上一張簡約的界面的效果圖 這裡是style裡面的內容 再來body裡面的內容,這裡用到的是失焦 onblur 和聚焦 onfocus <body> <center> <div> <form> <h3>用戶註冊</h3> <hr> <p>用戶名:<input type="text" id="name ...
  • 序號 方法 舉例 是否改變當前數組 1 instanceof 判斷變數是否是數組對象 否 2 join 將數組的元素組起一個字元串 join(separator) //將數組的元素組起一個字元串,以separator為分隔符,省略的話則用預設用逗號為分隔符 arr1 = [1,2,3,4,5]; r ...
  • 一、引言 JavaScript的內容分為三個部分,這三個部分分別是ECMAScript、DOM、BOM三個部分組成。所謂ECMAScript就是JavaScript和核心基礎語法,DOM是文檔對象模型,最後剩下的BOM則是瀏覽器對象模型。這三個部分相輔相成組成了現在的JavaScript。 二、導入 ...
  • 在做WEB開發的時候我們經常會遇到分頁的處理,如果在PC上顯示網頁的話,使用傳統的分頁是可以接受的。那麼,當我們為手機或其他移動端設計界面的話,使用分頁未免有些笨拙和難以使用,這時候我們可以使用在單頁載入所有列表項。當屏幕滑動到最低端的時候,會出現“點擊載入更多”的按鈕,當我們點擊此按鈕的時候,會加 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...