運行時的函數

来源:https://www.cnblogs.com/wydumn/archive/2019/09/23/11575497.html
-Advertisement-
Play Games

1. 一級函數 first class functions 1. 函數是一個對象 1. 2. 函數是一級函數,函數可以 1. 存儲在變數中\(函數表達式\) 2. 從一個函數返回 3. 作為參數傳遞給另一個函數\(回調\) 3. 高階函數 higher order function 1. 返回另一個 ...


  1. 一級函數 first-class functions

    1. 函數是一個對象

    2. 函數是一級函數,函數可以

      1. 存儲在變數中(函數表達式)

      2. 從一個函數返回

      3. 作為參數傳遞給另一個函數(回調)
    3. 高階函數 higher-order function

      1. 返回另一個函數的函數 或 接受其他函數作為參數的函數 被稱為高階函數

        1. function alertThenReturn() {
              alert('Message 1!');
          
              return function () {
                  alert('Message 2!');
              };
          }
          
          const innerFunction = alertThenReturn();
          
          alertThenReturn();    // 顯示 'Message 2!'
          innerFunction();        //顯示 'Message 2!'
          alertThenReturn()();    //顯示 'Message 1!' 然後顯示 'Message 2!'
  2. 回調callback

  3. 作用域

    1. 詞法作用域lexical scope和執行環境execution context

      1. 塊作用域和函數作用域稱為詞法作用域

      2. 當一個函數被運行時,會創建一個新的運行時作用域。這個作用域表示該函數的上下文,就是可供該函數使用的一組變數。這就是運行時作用域,即執行環境。
    2. 執行環境包括:

      1. 函數的參數

      2. 函數內聲明的本地變數

      3. 父函數作用域內聲明的變數

      4. 全局變數
    3. 函數作用域 function scope

      1. 塊級作用域 block scope

        1. ES6用let 和 const 關鍵字實現塊級作用域

        2. var x = 10;      
          // 這裡輸出 x 為 10      
          {      
             let x = 2;      
          // 這裡輸出 x 為 2      
          }      
          // 這裡輸出 x 為 10
          1. const
            1. 此聲明創建一個常量。常量的值不能通過重新賦值來改變,並且不能重新聲明
            2. 作用域可以是全局或本地聲明的塊
          2. let
            1. 聲明一個塊級作用域的本地變數,並且可選的將其初始化為一個值。
            2. 為什麼使用let
              1. 像數學里的描述,let x be an arbitrary
          3. 暫存死區
            1. 通過let聲明的變數直到他們的定義被執行時才初始化,在初始化前訪問該變數會導致ReferenceError.

            2. 該變數處在自頂部到初始化處理的暫存死區。

            3. 如以下代碼中的ReferenceError

            4. function do_something() {
                console.log(bar); // undefined
                console.log(foo); // ReferenceError
                var bar = 1;
                let foo = 2;
              }
        3. 用var關鍵字聲明的變數不具備塊級作用域的特性,在{ }外依然能被訪問到

          1. var x = 10;    
            // 這裡輸出 x 為 10    
            {    
               var x = 2;    
            // 這裡輸出 x 為 2    
            }    
            // 這裡輸出 x 為 2
      2. 函數作用域

        1. 函數可以訪問自己的所有變數和外部的所有全局變數
        2. var globalNumber = 5;
          
          function globalIncrementer() {
            const localNumber = 10;
          
            globalNumber += 1;
            return globalNumber;
          }
          
          console.log(globalIncrementer());    // 6
          
          console.log(globalIncrementer());    // 7
          
          console.log(globalIncrementer());    // 8
          
          console.log(localNumber);    // ReferenceError: localNumber is not defined 
          // 這裡localNumber在log函數的外部,因為無法取到localNumber的值,const定義的塊級作用域
      3. 作用域鏈 scope chain

          • 在訪問變數時,JS引擎將遍歷作用域鏈(查找變數的順序是線性的),首先查看最內層,然後查看外層作用域,最後在必要時到達全局作用域。
        1. Window對象
          • 聲明的任何全局變數都是作為window對象(全局對象)的屬性被訪問的,它表示作用域鏈的最外層。
      4. 變數陰影variable shadowing

        1. 創建的變數與作用域中的另一個變數具有相同名稱時,局部作用域的變數會shadow外部作用域中的變數

          • var money = '¥';
            
            function myMoney() {
              var money = '$';
              console.log(money);
            }
            
            myMoney();
            console.log(money);
          • 指向'$'的變數是在函數內部聲明的,將shadow位於外部作用域的同名變數,即指向'¥'的全局變數
          • 如果函數內部的沒有變數聲明,只有一個賦值,則會造成scope shadowing
        2. 在不同執行環境中的變數之間有任何重名重疊,會通過從內部作用域到外部作用域遍歷作用域鏈來解決。
  4. 閉包

    1. 詞法作用域lexical scoping

      • 'lexical' refers to the fact that lexical scoping uses the location where a variable is declared within the source code to determine where that variable is available.詞法作用域通過源代碼(自己寫的)中變數聲明的位置來確定變數在此處否可用。
    2. 閉包 closure

      1. 詞法環境(又一個坑)

        1. A Lexical Environment is a specification type used to define the association of Identifiers to specific variables and functions based upom the lexical nesting structure of ES code. 詞法環境是一個規範類型,是標識符與特定變數和函數基於ES代碼的詞法嵌套結構的關聯。
          • 一個詞法環境由環境記錄和可能為空的外部詞法環境引用組成。
        2. function makeFunc() {
              var name = 'count';
          
              function func2() {
                  console.log(name);
              }
              return func2;
          }
          
          var output = makeFunc();
          output();    // 'count'
        3. func2還未執行,被func1返回。一般來說,該段代碼不能正常運行,因為局部變數name在func1執行完畢後,name將不能再被訪問。但是,Why it works?
          1. 因為JS中的函數會形成閉包。函數保留對其作用域的訪問的這個過程被稱為閉包。
            1. 閉包是由函數和創建該函數的詞法環境組合而成。
            2. 在這裡“詞法環境”是指在JS文件中編寫的代碼。
          2. output是func2函數實例的引用,而func2實例仍可訪問其詞法作用域中的變數,即可以訪問name.
    3. 函數保留其作用域

      1. 標識符是指用來標識某個實體的一個符號,在不同的應用環境下有不同的含義。在編程語言中,標識符是用戶編程時使用的名字,用於給變數、常量、函數、語句塊等命名,以建立起名稱與使用之間的關係。

      2. 當使用標識符時,作用域鏈將被檢查,以檢索標識符的值。作用域鏈對於函數訪問代碼中的標識符來說非常強大的工具。


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

-Advertisement-
Play Games
更多相關文章
  • 從 MySQL 5.7.8 開始,MySQL 支持原生的 JSON 數據類型。 一. 創建json(不可以設置長度,可以是null,不能用有預設值) mysql> CREATE TABLE lnmp ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, ` ...
  • 建表語句: 報錯: 原因: 我這裡使用 api,method 來做 api 表的聯合主鍵,此時會根據這兩個欄位建立索引,charset 是 utf8 ,也就是一個字元3個位元組, 那麼總共索引的位元組為: 500*3+50*3 = 1650 個位元組,而mysql 要求的索引是 767 個位元組。 解決: ...
  • 一、操作資料庫1.1 創建資料庫1.2 查看資料庫1.3 修改資料庫1.4 刪除資料庫1.5 選擇資料庫二、操作表2.1 創建表2.2 查看表2.3 修改表2.4 刪除表三、操作表記錄CRUD3.1 INSERT3.2 UPDATE3.3 DELETE3.4 SELECT四、備份恢複數據庫五、多表設... ...
  • //從頭截取 update 表名 set 表列名 =SUBSTRING(表列名,1,目標位置數值) //!計數從1開始,從左往右 where 條件 //條件自己選擇,不加where條件會更新所有行,請特別註意 //截取中間部分 update 表名 set 表列名 =SUBSTRING(表列名,目標位 ...
  • 前言 開心一刻 我要飛的更高,飛的更高,啊! 謂詞 SQL 中的謂詞指的是:返回值是邏輯值的函數。我們知道函數的返回值有可能是數字、字元串或者日期等等,但謂詞的返回值全部是邏輯值(TRUE/FALSE/UNKNOW),謂詞是一種特殊的函數。關於邏輯值,可以查看:神奇的 SQL 之溫柔的陷阱 → 三值 ...
  • "使用CoordinatorLayout打造各種炫酷的效果" "自定義Behavior —— 仿知乎,FloatActionButton隱藏與展示" "NestedScrolling 機制深入解析" " 一步步帶你讀懂 CoordinatorLayout 源碼" "自定義 Behavior 仿新浪微 ...
  • 近期有空,玩轉React Native。 https://github.com/andyc365/ReactNativeMessager React Native Messager A React Native based cross-platform messenger(Messager) app ...
  • 用redux有一段時間了,感覺還是有必要把其相關的知識點系統的總結一下的,畢竟好記性不如爛筆頭。上篇博客更新了關於《ES6中的迭代器、Generator函數以及Generator函數的非同步操作》的內容,該內容時saga的基礎,稍後會總結saga相關知識點。循序漸進,本篇博客主要總結的是Redux相關 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...