久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網
最全最豐富的資訊網站

簡單了解JavaScript閉包

本篇文章給大家?guī)砹岁P于JavaScript的相關知識,其中主要介紹了關于JavaScript閉包的相關問題,閉包的概念有很多版本,不同的地方對閉包的說法不一,下面一起來看一下,希望對大家有幫助。

簡單了解JavaScript閉包

什么是閉包?

閉包的概念是有很多版本,不同的地方對閉包的說法不一

維基百科:在計算機科學中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函數閉包(function closures),是在支持頭等函數的編程語言中實現詞法綁定的一種技術。

MDN: 閉包(closure)是一個函數以及其捆綁的周邊環(huán)境狀態(tài)(lexical environment詞法環(huán)境)的引用的組合。

個人理解:

  • 閉包是一個函數(返回一個函數)
  • 返回的函數保存了對外變量引用

一個簡單的示例

function fn() {    let num = 1;    return function (n) {        return n + num     } }let rFn = fn()let newN = rFn(3) // 4
登錄后復制

num 變量作用域在 fn 函數中, rFn 函數卻能訪問 num 變量,這就是閉包函數能訪問外部函數變量。

從瀏覽器調試和 VSCode Nodejs 調試看閉包

  • 瀏覽器

簡單了解JavaScript閉包

  • VS Code 配合 Node.js

簡單了解JavaScript閉包

看到 Closure 中 fn 是閉包函數,其中保存 num 變量。

一個經典的閉包:單線程事件機制+循環(huán)問題,以及解決辦法

for (var i = 1; i <= 5; i++) {  setTimeout(() => {    console.log(i);   }, i * 1000); }
登錄后復制

登錄后復制

輸出的結果都是 6,為什么?

  • for 循環(huán)是同步任務
  • setTimeout 異步任務

for 循環(huán)一次,就會將 setTimeout 異步任務加入到瀏覽器的異步任務隊列中,同步任務完成之后,再從異步任務中拿新任務在線程中執(zhí)行。由于 setTimeout 能夠訪問外部變量 i, 當同步任務完成之后,i 已經變成了6, setTimeout 中能夠訪問變量 i 都是 6。

解決辦法1:使用 let 聲明

for (var i = 1; i <= 5; i++) {  setTimeout(() => {    console.log(i);   }, i * 1000); }
登錄后復制

登錄后復制

解決辦法2:自執(zhí)行函數 + 閉包

for (var i = 1; i <= 5; i++) {   (function(i){      setTimeout(() => {    console.log(i);   }, i * 1000)   })(i) }
登錄后復制

解決辦法3:setTimeout 傳遞第三參數

第三個參數意思:附加參數,一旦定時器到期,它們會作為參數傳遞給要執(zhí)行的函數

for (var i = 1; i <= 5; i++) {  setTimeout((j) => {    console.log(j);   }, 1000 * i, i); }
登錄后復制

閉包與函數科里化

function add(num) {  return function (y) {    return num + y;   }; };let incOneFn = add(1); let n = incOneFn(1);  // 2let decOneFn = add(-1); let m = decOneFn(1); // 0
登錄后復制

add 函數的參數保存了閉包函數變量。

實際作用

在函數式編程閉包有非常重要的作用,lodash 等早期工具函數彌補 javascript 缺陷的工具函數,有大量的閉包的使用場景。

使用場景

  • 創(chuàng)建私有變量
  • 延長變量生命周期

節(jié)流函數

防止?jié)L動行為,過度執(zhí)行函數,必須要節(jié)流, 節(jié)流函數接受 函數 + 時間作為參數,都是閉包中變量,以下是一個簡單 setTimeout 版本:

function throttle(fn, time=300){    var t = null;    return function(){        if(t) return;         t = setTimeout(() => {             fn.call(this);             t = null;         }, time);     } }
登錄后復制

防抖函數

一個簡單的基于 setTimeout 防抖的函數的實現

function debounce(fn,wait){    var timer = null;    return function(){        if(timer !== null){            clearTimeout(timer);         }         timer = setTimeout(fn,wait);     } }
登錄后復制

React.useCallback 閉包陷阱問題

問題說明:父/子 組件關系, 父子組件都能使用 click 事件同時修改 state 數據, 并且子組件拿到傳遞下的 props 事件屬性,是經過 useCallback 優(yōu)化過的。也就是這個被優(yōu)化過的函數,存在閉包陷阱,(保存一直是初始 state 值)

import { useState, useCallback, memo } from "react";const ChildWithMemo = memo((props: any) => {  return (    <div>       <button onClick={props.handleClick}>Child click</button>     </div>   ); });const Parent = () => {  const [count, setCount] = useState(1);  const handleClickWithUseCallback = useCallback(() => {    console.log(count);   }, []); // 注意這里是不能監(jiān)聽 count, 因為每次變化都會重新綁定,造成造成子組件重新渲染    return (    <div>       <div>parent count : {count}</div>       <button onClick={() => setCount(count + 1)}>click</button>       <ChildWithMemo handleClick={handleClickWithUseCallback} />     </div>   ); };export default Parent
登錄后復制

  • ChildWithMemo 使用 memo 進行優(yōu)化,
  • handleClickWithUseCallback 使用 useCallback 優(yōu)化

問題是點擊子組件時候,輸出的 count 是初始值(被閉包了)。

解決辦法就是使用 useRef 保存操作變量函數:

import { useState, useCallback, memo, useRef } from "react";const ChildWithMemo = memo((props: any) => {  console.log("rendered children")  return (    <div>       <button onClick={() => props.countRef.current()}>Child click</button>     </div>   ); });const Parent = () => {  const [count, setCount] = useState(1);  const countRef = useRef<any>(null)    countRef.current = () => {    console.log(count);   }  return (    <div>       <div>parent count : {count}</div>       <button onClick={() => setCount(count + 1)}>click</button>       <ChildWithMemo countRef={countRef} />     </div>   ); };export default Parent
登錄后復制

針對這個問題,React 曾經認可過社區(qū)提出的增加 useEvent 方案,但是后面 useEvent 語義問題被廢棄了,對于渲染優(yōu)化 React 采用了編譯優(yōu)化的方案。其實類似的問題也會發(fā)生在 useEffect 中,使用時要注意閉包陷阱。

性能問題

  • 閉包不要隨意定義,定義了一定找到合適的位置進行銷毀。因為閉包的變量保存在內存中,不會被銷毀,占用較高的內存。

使用 chrome 面板功能 timeline + profiles 面板

  1. 打開開發(fā)者工具,選擇 Timeline 面板
  2. 在頂部的Capture字段里面勾選 Memory
  3. 點擊左上角的錄制按鈕。
  4. 在頁面上進行各種操作,模擬用戶的使用情況。
  5. 一段時間后,點擊對話框的 stop 按鈕,面板上就會顯示這段時間的內存占用情況。

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
国产一区调教| 成人亚洲精品| 国产精品一区毛片| 五月综合激情| 粉嫩av一区二区三区四区五区| 午夜日韩av| 欧美日韩免费观看视频| 免费成人性网站| 精品在线91| 特黄特色欧美大片| 激情黄产视频在线免费观看| 国产精品美女| 99久久久国产精品美女| 精品国产一级| 国产精品一区三区在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产亚洲欧美日韩精品一区二区三区 | 国产精品99久久精品| 麻豆91精品| 91久久久久| 国产理论在线| 亚洲免费毛片| 蘑菇福利视频一区播放| 欧美日韩精品一本二本三本| 久久久久97| 日韩精品永久网址| 久久久一二三| 欧美日韩激情| 婷婷综合网站| 另类激情亚洲| 日韩精选在线| 国产欧美大片| 最近高清中文在线字幕在线观看1| 国产在线观看91一区二区三区| 国产精品99久久免费观看| 免费看一区二区三区| 国产精品极品| 日韩三区免费| 婷婷精品进入| 乱人伦精品视频在线观看| 亚洲人成毛片在线播放女女| 综合日韩在线| 国产一区二区三区久久| 久久尤物视频| 蜜桃国内精品久久久久软件9| 日韩中文字幕麻豆| 日韩精品1区2区3区| 日韩三级一区| 国产精品白丝一区二区三区| 蜜臀久久精品| 91精品一区二区三区综合在线爱| 99久久亚洲精品蜜臀| 欧美日韩亚洲一区二区三区在线| 精品一区二区三区中文字幕视频| 亚洲不卡av不卡一区二区| 亚洲毛片一区| 韩日一区二区| 国产日产高清欧美一区二区三区 | 亚洲精品大片| 久久精品国产精品亚洲毛片| 99久久激情| 国模精品一区| 婷婷亚洲成人| 激情婷婷综合| 黄色精品视频| 日韩av资源网| 在线亚洲成人| 久久精品播放| 欧美午夜网站| 黑丝一区二区| 国精品产品一区| aa亚洲婷婷| 欧美精品高清| 欧美91在线| 日韩av一区二区三区| 亚洲精品va| 久久九九电影| 欧美精品一区二区三区精品| 日韩av免费| 麻豆国产在线| 日韩欧美一区免费| 首页国产精品| 另类专区亚洲| 日韩国产一区| av高清不卡| 日韩欧美字幕| 91一区二区三区四区| 国产一区二区三区天码| 国产亚洲在线| 亚洲制服少妇| 亚洲一区二区三区四区电影| av亚洲免费| 99视频精品免费观看| 欧美日韩1区| 999国产精品| 日本特黄久久久高潮| 国产欧美日韩一区二区三区在线| 精品一区二区三区在线观看视频| 成人看片网站| 日韩高清欧美激情| 日韩欧美国产精品综合嫩v| 亚洲va在线| 久久国内精品视频| 亚洲午夜视频| 国产午夜久久av| 99视频精品视频高清免费| 亚洲精品第一| 成人精品天堂一区二区三区| 日韩精品欧美大片| 99热精品久久| 日本少妇精品亚洲第一区| 肉色欧美久久久久久久免费看| 久久性天堂网| 成人三级高清视频在线看| 日韩一区精品| 最新亚洲一区| 久久av国产紧身裤| 亚洲精品在线a| 亚洲精品网址| 特黄特色欧美大片| 精品72久久久久中文字幕| 亚洲精品欧美| 一区二区国产在线观看| 性欧美69xoxoxoxo| 中文av在线全新| 国产高清精品二区| 奇米777国产一区国产二区| 欧美专区在线| 亚洲欧美不卡| 91成人精品视频| 91精品精品| 国产理论在线| 日韩av二区| 日韩精品2区| 视频福利一区| 久久久精品五月天| 久久久精品日韩| 欧美日韩中文一区二区| yellow在线观看网址| 国户精品久久久久久久久久久不卡 | 高清一区二区| 日韩免费看片| 国产精品原创| 99热国内精品| 亚洲尤物av| 你懂的国产精品| 日韩欧美一区二区三区在线视频| 欧美成人国产| 日韩一区二区三区四区五区| 国产精品久久久久9999高清| sm久久捆绑调教精品一区| 樱桃视频成人在线观看| 精品欠久久久中文字幕加勒比| 中文字幕在线免费观看视频| 超碰99在线| 婷婷成人在线| 欧美日韩四区| 狠狠爱成人网| 爽好久久久欧美精品| 三级在线观看一区二区| 日韩欧美高清一区二区三区| 欧美日韩xxxx| 国产中文欧美日韩在线| 亚洲tv在线| 精品视频高潮| 自由日本语亚洲人高潮| 在线日韩成人| 国产精品a级| 播放一区二区| 日韩一区精品视频| 欧美日韩一区二区国产 | 久久性天堂网| 亚洲丝袜美腿一区| 国产精品一区二区三区av| 亚洲黄色免费看| 亚洲天堂久久| 日韩av一区二区三区四区| 深夜福利一区| 中文字幕在线看片| 日韩一级欧洲| 你懂的国产精品| 免费日韩视频| 日本在线啊啊| 视频一区欧美精品| 樱桃视频成人在线观看| 中文视频一区| 久久一区二区三区喷水| 国产亚洲一区二区三区啪| 99久久久久国产精品| 国产精品久久久亚洲一区| 欧美香蕉视频| 亚洲大片在线| 999久久久精品国产| 免费在线亚洲欧美| 久久久91麻豆精品国产一区| 免费观看不卡av| 国产精品任我爽爆在线播放| 午夜欧美理论片| 亚洲啊v在线| 日本麻豆一区二区三区视频|