JS基礎語法---預解析

来源:https://www.cnblogs.com/jane-panyiyun/archive/2019/11/29/11957297.html
-Advertisement-
Play Games

預解析:就是在解析代碼之前 1. 預解析做什麼事? 把變數的聲明提前了 提前到當前所在的作用域的最上面 函數的聲明也會被提前 提前到當前所在的作用域的最上面 舉例: function f1() { console.log(num); var num = 10; } f1(); //此時運行結果是un ...


預解析:就是在解析代碼之前  

1. 預解析做什麼事?

  • 把變數的聲明提前了----提前到當前所在的作用域的最上面
  • 函數的聲明也會被提前---提前到當前所在的作用域的最上面
  舉例:
    function f1() {
      console.log(num);
      var num = 10;
    }
    f1(); //此時運行結果是undefined

 

此時運行結果是undefined,因為預解析,變數聲明被提前了,實際按下麵的方式解析的:

    function f1() {
      var num
      console.log(num);
      num = 10;
    }
    f1(); //此時運行結果是undefined

 

舉例2:

    //函數調用的時候,把會函數的聲明提升到作用域的上面
    f1();//調用
    var num = 20;//這個變數的聲明會提升到變數使用之前
    function f1() {
      console.log(num);
      //var num=10;
    }

 

2. 預解析分段和局部作用域的問題

  •     預解析中,變數的提升,只會在當前的作用域中提升,提前到當前的作用域的最上面
  •     函數中的變數只會提前到函數的作用域中的最前面,不會出去
    function f1() {

      console.log(num);//undefined
      var num = 10;
    }
    f1();
    console.log(num);//報錯

 

  •     預解析會分段(多對的script標簽中函數重名,預解析的時候不會衝突)
  <script>

    function f1() {
      console.log("哈哈");
    }

  </script>
  <script>
    f1();
    function f1() {
      console.log("嘎嘎");
    }
  </script>

 

 

3. 快速識別預解析的結果

 練習1:

    var a = 25;
    function abc() {
      alert(a);//undefined
      var a = 10;
    }
    abc();
    console.log(a);//25

 

練習2:

    console.log(a);
    function a() {
      console.log('aaaaa');
    }
    var a = 1;
    console.log(a);//1

 

預解析下的代碼解讀:

(變數聲明在最上面,下麵是函數聲明)

    var a;
    function a() {
      console.log('aaaaa');
    }
    console.log(a); //此時輸出的是函數a的代碼
    a = 1;
    console.log(a);//1

 

代碼結果:

練習3:

    var a = 18;
    f1();
    function f1() {
      var b = 9;
      console.log(a);//undefined
      console.log(b);//9
      var a = '123';
    }

 

預解析下的代碼解讀:

   var a;
   a = 18;
   function f1() {
     var b;
     var a;
     b = 9;
     console.log(a);//undefined
     console.log(b);//9
    a = '123';
   }
   f1();

 

代碼結果:

 

 練習4:

    f1();
    console.log(c);
    console.log(b);
    console.log(a);
    function f1() {
      var a = b = c = 9;
      console.log(a);
      console.log(b);
      console.log(c);
    }

 

預解析下的代碼解讀:

 

recap:

隱式全局變數: 聲明的變數沒有var,  就叫隱式全局變數

局部變數: 在函數內部定義的變數,是局部變數, 外面不能使用

   function f1() {
     var a;//局部變數
     a=9;
     //隱式全局變數
     b=9;
     c=9;
     console.log(a);//9
     console.log(b);//9
     console.log(c);//9
   }
   f1();
   console.log(c);//  9
   console.log(b);// 9
   console.log(a);//報錯

 

代碼結果:

 

 練習4:

    f1();//-----報錯
    var f1 = function () {
      console.log(a);
      var a = 10;
    };

 

預解析下的代碼解讀:

    var f1;
    f1();//-----報錯,不能調用,因為下的f1是賦值的表達式
    f1 = function () {
      console.log(a); //f1報錯,這裡就沒有結果啦
      var a = 10;
    };

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 什麼是CommonJS規範?它與NodeJS是什麼關係呢?CommonJS 的底層實現原理是什麼? ...
  • 1、清空所有行和所有列 $('#dgJGQuery').datagrid({ columns: [], url: '', data: [] }); 2、採用 datagrid-groupview 分組展示後,取消分組展示。 datagrid使用分組展示 是基於view屬性,把view屬性設置為gro ...
  • 響應式開發 1. 響應式開發原理 使用媒體查詢針對不同寬度的設備進行佈局和樣式的設置,從而適配不同設備的目的 | 設備劃分 | 尺寸區間 | | | | | 超小屏幕(手機) | =768px~=992px~=1200px | 2. 響應式佈局容器 響應式需要一個父級作為佈局容器,來配合子級元素來實 ...
  • Accept Encoding和Content Encoding Accept Encoding和Content Encoding是HTTP中用來對採用何種壓縮格式傳輸正文進行協定的一對header。工作原理如下: 瀏覽器發送請求,通過Accept Encoding帶上自己支持的內容編碼格式列表 服 ...
  • 作者:水濤 座右銘:天行健,君子以自強不息 自白:我寫博文上來蹭蹭就是乾,我突然覺得我需要幽默一點了,好了,下麵我們說正經的 一、官方定義: DefinePlugin 允許創建一個在 編譯 時可以配置的全局常量。這可能會對開發模式和生產模式的構建允許不同的行為非常有用。如果在開發構建中,而不在發佈構 ...
  • 直接上代碼,複製粘貼就能用: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF ...
  • JS基礎語法 roadmap Part 1 - 2: Part 3 - 4: Part 5 - 6 ...
  • Google 跟蹤代碼管理器是一個跟蹤代碼管理系統 (TMS),可以幫助您快速輕鬆地更新網站或移動應用上的跟蹤代碼及相關代碼段(統稱為“代碼”)。將一小段跟蹤代碼管理器代碼添加到項目後,您可以通過網頁界面安全輕鬆地部署 Google Analytics(分析)和衡量代碼配置。 在通過clickCla ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...