匿名函數與閉包

来源:http://www.cnblogs.com/tzzf/archive/2017/12/24/8099051.html
-Advertisement-
Play Games

匿名函數:創建函數時,不指定函數名的函數。此種函數只能運行一次,可以避免變數全局污染,保護變數。 匿名函數可以回調使用,比如 btn.addEventListener("click",function(){...}) 也可以用匿名函數聲明函數名,比如var abc=function (){conso ...


匿名函數:創建函數時,不指定函數名的函數。此種函數只能運行一次,可以避免變數全局污染,保護變數。

匿名函數可以回調使用,比如 btn.addEventListener("click",function(){...})

也可以用匿名函數聲明函數名,比如var abc=function (){console.log(222)}

這種方法定義的函數和function abc(){console.log(222)}有什麼區別呢?

abc()   //報錯   變數提升但是函數沒有
var abc=function(){
    console.log(222)
}
abc()  //2222  函數聲明放在任意位置都可以被調用;
function abc(){
  console.log(2222)  
}

匿名函數也可以自己調用自己執行,有兩種方式可以實現方式

+function(...){...}(...)

(function(...){...})(...)

閉包:一個可以使用另外一個函數(外函數)作用域中的變數的函數(內函數)。

原理就是外部函數作用域(AO)在作用域鏈下不被釋放可以被重用。

釋放AO的先後順序為先釋放內函數AO,再釋放外函數AO。

閉包有3個特點:1.有內外兩個函數2.要有return值3.要有受保護的變數

在javaScript高級教程設計書中這麼介紹閉包的缺點

function createFunction(){
    var result=new Array;
    for(var i=0;i<10;i++){
        result[i]=function(){
    return i;
}
}
return result;
}

錶面上看每個函數似乎應該返回自己的索引值,但實際上每個函數返回10。因為每個函數的作用域鏈中都保存者createFunction()函數的活動對象,所以他們引用的都是同一個變數i。當createFunction()函數返回後,變數i的值是10;

function createFunction(){
    var result=new Array;
    for(var i=0;i<10;i++){
        result[i]=function(num){
    return function(){
    return num;
};
}(i);
}
return result;
}

在這個版本中,我們沒有直接把閉包賦值給數組,而是定義了一個匿名函數,並將立即該匿名函數的結果賦給數組。這裡的匿名函數有一個參數num,也就是最終的函數要返回的值。在調用每個匿名函數時,我們傳入變數i。又創建並返回了一個訪問num的閉包。這樣一來,result數組中的每個函數都有自己num變數的一個副本,因此就可以返回各自的不同的值

總結:匿名函數都和閉包除了都是函數,並沒有共同點。

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.1 索引的介紹 索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定信息。如果想按特定職員的姓來查找他或她,則與在表中搜索所有的行相比,索引有助於更快地獲取信息。 索引的一個主要目的就是加快檢索表中數據的方法,亦即能協助信息搜索者儘快的找到符合限制條件的記錄ID ...
  • 自動佈局是一項強大的功能,它允許開發者創建一個單一的用戶界面,它會自動調整屏幕大小,方向和本地化,Xcode5中的編輯界面的自動佈局功能已經大大增強了。當約束缺失或錯誤配置時,界面生成器可以修複佈局。 參考資料:《iOS7開發快速入門》 ...
  • 轉載請註明原文鏈接:http://www.cnblogs.com/yanyojun/p/8099523.html 代碼已上傳到github:https://github.com/YanYoJun/FragmentTabHostDemo 上一篇有講過使用ViewPager來實現標簽卡效果的。這一篇講一 ...
  • Android遠程桌面助手理論上相容Android4.4至Android8.1之間所有的原生安卓系統,其他第三方ROM,如MIUI、Flyme、EMUI和Smartisan OS等也都陸續測試過,目前尚未發現相容性問題。 ...
  • 前言 在框架規劃時,就有提到過這個框架的一些常用功能需要支持 環境下的調用,也就是需要實現API的多平臺支撐 為什麼要多平臺支撐?核心仍然是復用代碼,比如在微信下,在釘釘下,在quick容器下, 如果沒有多平臺支撐,那麼 只能用於quick容器下,釘釘和微信下就得分別用其它代碼實現, 代碼復用率低, ...
  • 前言 一切就緒,開始規劃API,這裡在規劃前對API進行了一次分類:__短期API、長期API__ 首先申明下,這個是在實際框架演變過程中自創的一個概念,其它混合框架可能也會有這個概念,但應該是會在原生底層來實現,而不是前端實現。。 而這裡由於是 ,所以相比其它混合框架,前端多了一個處理引擎(包括多 ...
  • 1、 添加自定義屬性 page 2、 為 ztree 每個樹形節點,添加點擊事件 ...
  • 在每個節點添加 id 和 pid, id 表示當前節點編號,pid 表示父節點編號 第一步:在頁面顯示菜單位置,添加 ul設置 class=”ztree” 第二步:開啟簡單數據格式支持 第三步:編寫樹形菜單數據 第四步:生成樹形菜單 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...