通過取父級for循環的i來理解閉包,iife,匿名函數

在使用for循環的時候,假如需要在循環體中添加一個匿名函數處理其他的事情,那么,在這個匿名函數內,如果需要用到對應的i,因為閉包的緣故,循環體循環結束后才返回i,所以i最終為最后一次++的數值。

?

閉包即函數有權訪問另一函數的局部變量,常用方法為在函數內部創建另一個需要引用這個函數內部變量的函數。
解決方式1

?

通過匿名函數傳參,因為匿名函數取得參數是每次for循環里的i,所以每次打印的值為0,1,2,......
匿名函數自我執行的方法是,在函數體外套一對圓括號,形成一個表達式,在圓括號后再加另一個圓括號,里面可傳參數。此方法即IIFE,又叫立即執行函數表達式。
寫到這里,還需要說一下函數聲明和函數表達式的區別:
1.函數聲明必須有標識符,即函數名;
2.函數聲明存在變量提升;
3.函數聲明不能出現在循環,判斷、try、with等語句的代碼塊中;
解決方式2

此方法和上述方法有異曲同工之妙,也是在匿名函數體外部取到了循環體中的i;

在JS中,每一個函數被調用的時候都會創建一個執行上下文,在該函數內部定義的變量和函數只能在該函數內部被使用,正是因為這個上下文,使得我們在調用函數的時候能創建一些私有變量。

?

為什么a()()兩次打印都是1,是因為每次執行a()()的時候都給a重新賦值1,而b()/c()執行的只是a return出來的匿名函數;
為什么報錯?
因為在javascript解析代碼時,當遇到function關鍵字時,會默認把它當作一個函數聲明,而不是函數表達式,如果沒有顯示的表達成函數表達式,就報錯。因為函數聲明需要一個函數名,而上面的代碼中函數沒有函數名。(在執行到第一個左括號時報錯)
為什么在加了函數名之后,依然報錯?
在一個表達式后面加上括號表示立即執行,而在一個語句后加上括號,該括號和之前的語句完全不搭邊,而只是一個分組操作符,用來控制運算中的優先級,當js解析到括號時,發現里面為空,所以報錯。(在執行到第二個右括號時報錯)
因為在js中括號內部不能為語句,所以js解析到括號時,緊接著發現了function關鍵字,所以自動把括號內的語句當作表達式而不是函數聲明。
所以,立即執行函數,你可以這么寫:

?

而上面我們用立即執行函數加閉包,取到了循環體中的i;可見合理利用立即執行函數加上閉包,還能保存變量的狀態。
在模塊化中,也可以用立即執行函數來處理模塊化,可以減少全局變量造成的空間污染,構造更多的私有變量。

?

轉載于:https://www.cnblogs.com/ricoliu/p/6652732.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456118.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456118.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456118.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H.264將普及 視頻編碼講壇之H.264前世今生

隨著HDTV等高清資源的興起,H.264這個規范頻頻出現在我們眼前,HD-DVD和藍光DVD均計劃采用這一標準進行節目制作。而且自2005年下半年以來,無論是NVIDIA還是ATI都把支持H.264硬件解碼加速作為自己最值得夸耀的視頻技術。而數碼播放器領域也吹來…

python命令方式和關鍵字

常用命名方式 不管是文件,變量,函數或類名等等,命名都要遵守一個基本規范,就是,命名要有意義,易讀易懂。因此,兩種主流的命名方式出現了,他們分別是駝峰命名方法 和 使用下劃線分隔…

【機器學習】嶺回歸

import numpy as npimport matplotlib.pyplot as plt %matplotlib inlinefrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import mean_squared_error,r2_score from sklearn import datasets# CV crosss validation :交叉驗證 from skl…

P1057 傳球游戲

題目描述 上體育課的時候,小蠻的老師經常帶著同學們一起做游戲。這次,老師帶著同學們一起做傳球游戲。 游戲規則是這樣的:n個同學站成一個圓圈,其中的一個同學手里拿著一個球,當老師吹哨子時開始傳球,每個同…

Keepalived 添加腳本配置監控haproxy方案

作者:風過無痕-唐出處:http://www.cnblogs.com/tangyanbo/ 上一篇文章已經講到了keepalived實現雙機熱備,且遺留了一個問題 master的網絡不通的時候,可以立即切換到slave,但是如果只是master上的應用出現問題的時候&am…

H.264編解碼標準的核心技術(提供相關流程圖)

最近在學習H.264編解碼知識,上網搜了不少資料看,發現大多數中文資料中都缺少相應的圖片,例如編解碼流程圖、編碼模板等,這對加深理解是很有幫助 的。木有辦法,只好回去潛心閱讀《H.264_MPEG-4_Part_10_White_Paper》&a…

【機器學習】總結:線性回歸求解中梯度下降法與最小二乘法的比較

在線性回歸算法求解中,常用的是最小二乘法與梯度下降法,其中梯度下降法是最小二乘法求解方法的優化,但這并不說明梯度下降法好于最小二乘法,實際應用過程中,二者各有特點,需結合實際案例具體分析。 最后有…

struts2學習(3)struts2核心知識II

一、struts.xml配置:                                                   1.分模塊配置方法: 比如某個系統多個模塊,我們把資產管理模塊和車輛管理模塊,分開,在總…

【機器學習】邏輯斯蒂回歸概率計算和手動計算對比

二分類,邏輯斯蒂回歸概率計算 import numpy as np from sklearn import datasets from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_splitX,y datasets.load_iris(True)cond y!2X X[cond] y y[cond]resul…

WPF快速指導2:模板

WPF快速指導2:模板 本文摘要: 1:模板作用; 2:樣式模板; 3:數據模板; 4:如何使用ControlTemplate; 5:如何使用DataTempla…

五個最佳媒體格式轉換器

我們經常會遇到下載的視頻文件格式不對,無法在其他播放設備(如手機、DVD)中使用的問題,現在,我們介紹五個功能強大且易于使用的媒體轉換器,用于轉換不同類型的視頻文件。   Super (Windows) Super是一個免…

【機器學習】六種算法在人臉補全中的應用比較(K緊鄰,線性,決策樹,嶺回歸,套索回歸,ElasticNet)

需求: 根據人的上半邊臉預測下半邊臉,用各種算法取得的結果與原圖比較 思考: 這是一個回歸問題,不是分類問題(人臉數據不固定) 數據集一共包含40個人,每一個人10張照片,分布規律 每…

性能優化之NSDateFormatter

為什么要優化NSDateFormatter?首先,過度的創建NSDateFormatter用于NSDate與NSString之間轉換,會導致App卡頓,打開Profile工具查一下性能,你會發現這種操作占CPU比例是非常高的。據官方說法,創建NSDateForma…

QuickTime文件格式解析

QuickTime文件格式解析Peter Lee 2008-06-14 一、簡介 QuickTime是Apple公司開發的一套完整的多媒體平臺架構,可以用來進行多種媒體的創建,生產,和分發,并為這一過程提供端到端的支持:包括媒體的實時捕捉,…

python的數據類型轉換

數據類型轉換 將數據由當前類型變化為其他類型的操作就是數據類型轉換。數據類型轉換分為兩類,分別是自動數據類型轉換 和 強制數據類型轉換。 自動轉換(隱式轉換) 自動轉換時程序根據運算要求進行的轉換,不許要人工干預。 1.自動類型轉換不需要人工干…

Linux文件屬性及如何修改文件屬性

ls -al:顯示文件的文件名與相關屬性并列出所有文件詳細的權限與屬性 dr-xr-x---. 7 root root 4096 Apr3 12:31 . 權限 連接 所有者 用戶組 文件容量 修改日期 文件名 第一個字符代表這個文件是“目錄,文件&#x…

SyntaxError:identifier starts immediately after numeric literal

1、錯誤描寫敘述2、錯誤原因因為在改動方法傳參的過程,須要傳個id,可是這個id是字符串類型,傳入的是數值型3、解決的方法在傳參時,須要加入“”,變成字符串類型User.modify("id");

python中的運算和運算符

運算和運算符 運算: 由一個以上的值經過變化得到新值得過程,就是運算。 運算符: 用于運算的符號,就是運算符 運算的分類: 1.算數運算 2.比較運算/關系運算 3.賦值運算 4.邏輯運算 5.位運算 6.成員運算 7.身份運算算術…

【數據分析】reshape(-1,1)和numpy的廣播機制

在創建DataFrame的時候常常使用reshape來更改數據的列數和行數。 reshape可以用于numpy庫里的ndarray和array結構以及pandas庫里面的DataFrame和Series結構。 源數據 reshape函數 reshape(行,列)可以根據指定的數值將數據轉換為特定的行數和…

藍橋杯-組素數-java

/* (程序頭部注釋開始) * 程序的版權和版本聲明部分 * Copyright (c) 2016, 廣州科技貿易職業學院信息工程系學生 * All rights reserved. * 文件名稱: 藍橋杯賽題 * 作 者: 彭俊豪 * 完成日期&#xf…