函數是“一等公民”

来源:https://www.cnblogs.com/yuanyeAjax/archive/2018/03/17/8587062.html
-Advertisement-
Play Games

在JS中,函數被稱為“一等公民”,英文原文first-class object(第一類對象)。 既然是對象,那麼它就可以: 除了上述對象的功能,函數區別其它對象之處是能被調用。 在JS中,存在變數提升。當一個變數通過var聲明之後,會立即被提升至當前作用域頂部(let 和 const 聲明的變數則不 ...


在JS中,函數被稱為“一等公民”,英文原文first-class object(第一類對象)。

既然是對象,那麼它就可以:

  1. 通過字面量創建
  2. 賦值給變數,數組元素和其他對象的屬性(property)
  3. 作為參數傳遞給函數
  4. 作為函數的返回值
  5. 含有能被動態創建和賦值的屬性

除了上述對象的功能,函數區別其它對象之處是能被調用。

 

在JS中,存在變數提升。當一個變數通過var聲明之後,會立即被提升至當前作用域頂部(let 和 const 聲明的變數則不會)。例如:

1 function a() {
2     console.log(b);
3     var b = 10;
4 }
5 a();  //undefined

上面這段代碼的運行結果為undefined。原因是,當b變數通過var聲明後,發生了變數提升,立即被提升至當前作用域頂部(註意,提升是在聲明之後立即發生,此時b還未被定義!),此時的“當前作用域”就是函數a的作用域。因此,上面的代碼其實是這樣的:

1 function a() {
2     var b;  //變數的聲明被提升至當前作用域頂部
3     console.log(b);
4     b = 10;
5 }
6 a();

變數b的聲明被提升至第二行(提升的只是聲明),且此時b沒有被賦值,因此代碼繼續執行至第三行console.log(b)時,就輸出了undefined。

 

而JS除了變數提升外,還存在“函數提升”。同理,函數也會被提升,只不過,函數不僅僅是聲明的提升,而是“整體提升”。請看下麵的代碼:

1 function a() {
2     b();
3     function b() {
4         console.log("yes!");
5     }
6 }
7 a();  //yes!

此時可以正常執行函數b。這正是因為函數被提升,而且是“整體提升”,所以b()才能正常執行。這段代碼其實等價於:

1 function a() {
2     function b() {
3         console.log("yes!");
4     }
5     b();
6 }
7 a();  //yes!

需要註意的是,只有普通形式聲明的函數才能被提升!例如:

1 function a() {
2     b();
3     var b = function() {        //字面量聲明的函數
4         console.log("yes!");
5     }
6 }
7 a();  //報錯

這裡的匿名函數是通過字面量聲明的,所以不存在函數提升,結果就會報錯。

 

但是,當變數和函數同時被聲明時,誰提升得更優先呢?

在JS中,函數之所以被稱為“一等公民”,其中一個原因就是它比變數更有優先順序,在發生提升時,函數會提升至作用域的最頂部!例如:

1 function a() {
2     var b = 10;
3     function b () {
4         console.log("yes!");
5     }
6     console.log(b);
7     console.log(typeof b);
8 }
9 a();    //10  number

在這段代碼中,變數b的聲明被提升,但作為“一等公民”的函數卻被提升到變數b的聲明之上。在執行代碼階段,10賦值給b,因此輸出結果,b是10,類型變成了number。


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

-Advertisement-
Play Games
更多相關文章
  • HDFS Commands Guide HDFS Commands Guide. 1 3.1概述... 1 3.2 用戶命令... 1 3.2.1 classpath. 1 3.2.2 dfs. 1 3.2.3 envvars. 1 3.2.4 fetchdt. 1 3.2.5 fsck. 1 3. ...
  • 《Android5.0+高級動畫開發》講的是如何藉助VectorDrawable技術,貝賽爾曲線技術,PathMeasure技術實現酷炫動畫。相比之前學習過的幀動畫,補間動畫,屬性動畫,它們有哪些值得我們學習的地方呢?Android為什麼在5.0以後推出了VectorDrawable技術?徐大神為什 ...
  • Android 6.0起,Android加強了許可權管理,引入運行時許可權概念。對於: 1. Android 5.1(API 22)及以前版本,應用許可權必須聲明在AndroidManifest.xml中,應用在安裝時,Android會列出其所需的所有許可權供用戶確認安裝。 2. Android 6.0(A ...
  • 先看效果圖 上一篇自定義view2因為字數的原因沒顯示在首頁,貌似只能在我隨筆列表裡看,這次是第三篇,為了湊點字數,把關鍵的地方提出來看一下 1canvas.drawText 的參數是怎麼控制 文字的位置的 其中x預設應該是文字的左邊距,y所對應的水平線是文字的底, 而不是文字的中心點,這裡比較重要 ...
  • 今天在開發過程中用到了UITableView,在對cell進行設置的時候,我發現對UITableViewCell的重用設置的方法有如下兩種,剛開始我也不太清楚這兩種之間有什麼區別。直到我在使用方法二進行重用的時候,具體實現代碼如下,其中CJMeetingReplyBasicCell是我自定義的UIT ...
  • 前言: 最近忙著搞項目,難得有時間,便來整理搞項目中學習到的知識 使用之前,先介紹一下android這種的五種數據儲存方式,分別為文件儲存,SharePrefence,SQL,使用ContentProvider存儲數據,網路存儲數據,其中,SharePrefence是一個輕量的儲存,主要是用來儲存a ...
  • 目的: 1. Cocos2d-x集成openinstall sdk? 有這麼一個場景,甲給乙分享了鏈接,乙使用並下載APP,推薦者甲和乙的關係這個思路是怎樣的? 你首先想到的也許會說,那當然就是給對方一個邀請碼去辨識啊。 1、掃碼下載,二維碼裡面有甲的推薦邀請號 2、APP下載包在本伺服器上下載,通 ...
  • iphone上打開safari,隨便訪問一個網站,mac上通過Safari的開發,我的iphone是可以看到的。如果打開APP,就提示“無可檢查的應用程式”。 解決方法 使用XCode運行我們的App就可以了。 原因是打包好的APP無法通過safari調試,而Xcode運行的是可以調試的。難道需要像 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...