運行時的函數

来源: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
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如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 ...