日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

javascript - 閉包在實際開發中有什么用?

瀏覽:210日期:2023-09-19 15:26:01

問題描述

javascript - 閉包在實際開發中有什么用?

看了一下視頻中對于閉包作用的解釋我還是表示不明白,比如說截圖中這段代碼完全可以在cmp函數中加一個passline參數來實現,沒必要使用閉包。

誰能舉一個更加好的例子說明閉包的作用啊?

問題解答

回答1:

延長局部變量的生命周期,封裝私有變量

2. 延續局部變量的壽命img 對象經常用于進行數據上報,如下所示:var report = function( src ){ var img = new Image(); img.src = src;};report( ’http://xxx.com/getUserInfo’ );但是通過查詢后臺的記錄我們得知,因為一些低版本瀏覽器的實現存在 bug,在這些瀏覽器下使用 report 函數進行數據上報會丟失 30%左右的數據,也就是說, report 函數并不是每一次都成功發起了 HTTP 請求。丟失數據的原因是 img 是 report 函數中的局部變量,當 report 函數的調用結束后, img 局部變量隨即被銷毀,而此時或許還沒來得及發出 HTTP 請求,所以此次請求就會丟失掉。現在我們把 img 變量用閉包封閉起來,便能解決請求丟失的問題:var report = (function(){ var imgs = []; return function( src ){var img = new Image();imgs.push( img );img.src = src; }})();回答2:

保存變量 大部分時候我是用它來替代全局變量 避免造成變量污染

回答3:

閉包解決的問題:基于JS的詞法作用域規則,其訪問是一直向上查找作用域,直到全局作用域。而想直接訪問某個作用域可通過閉包解決。

function foo(){var a = 1;function bar(){ console.log(a);}return bar;}var baz = foo();baz();

bar詞法作用域可以訪問foo內部作用域,foo執行后返回bar,最后賦值給baz,可以獲取并訪問foo內部作用域,只是標識符不同而已。該代碼就使用了閉包,可以說寫JS代碼處處可見閉包,使用閉包還有一個好處就是引用的作用域不會被垃圾回收處理,當然不合理的使用會耗內存

閉包用來增加變量(能訪問某作用域,自然能加變量)或者延長其生命周期(作用域被引用,自然會延長)

for (var i = 0; i < 5; i++){ setTimeout(function(){ console.log(i)},i * 1000)} for (var i = 0; i < 5; i++){ (function (i) { setTimeout(function(){ console.log(i)},i * 1000) })(i) }

第一個循環是聲明了幾個函數,共享全局i變量(變量和函數聲明都提升了)。第二個循環是定義了幾個立即執行函數,又傳遞了i值,故每個i值都有自己的作用域。這個是一個比較好的例子,閉包+循環,只是這個比較特別,閉包訪問自身的作用域。

當然最能體現閉包思想的是模塊,返回一個方法,該方法就相當引入了一個作用域。

閉包:就是一個獲取并訪問某個作用域,可在外訪問或者自身內部訪問。

回答4:

最大的兩個作用

讀取函數內部變量

讓變量值始終保持在內存里

第一個不贅述,看第二個,舉例

function f1(){var n=999;nAdd=function(){n+=1}function f2(){alert(n);}return f2;}var result=f1();result(); // 999nAdd();result(); // 1000

result實際上就是閉包f2函數。它一共運行了兩次,第一次的值是999,第二次的值是1000。這證明了,函數f1中的局部變量n一直保存在內存中,并沒有在f1調用后被自動清除。為什么會這樣呢?原因就在于f1是f2的父函數,而f2被賦給了一個全局變量,這導致f2始終在內存中,而f2的存在依賴于f1,因此f1也始終在內存中,不會在調用結束后,被垃圾回收機制(garbage collection)回收。這段代碼中另一個值得注意的地方,就是'nAdd=function(){n+=1}'這一行,首先在nAdd前面沒有使用var關鍵字,因此nAdd是一個全局變量,而不是局部變量。其次,nAdd的值是一個匿名函數(anonymous function),而這個匿名函數本身也是一個閉包,所以nAdd相當于是一個setter,可以在函數外部對函數內部的局部變量進行操作

管理私有變量和私有方法,將對變量(狀態)的變化封裝在安全的環境中

將代碼封裝成一個閉包形式,等待時機成熟的時候再使用,比如實現柯里化和反柯里化

需要注意的:

由于閉包內的部分資源無法自動釋放,容易造成內存泄露 解決方法是,在退出函數之前,將不使用的局部變量全部刪除。

閉包會在父函數外部,改變父函數內部變量的值。所以,如果你把父函數當作對象(object)使用,把閉包當作它的公用方法(Public Method),把內部變量當作它的私有屬性(private value),這時一定要小心,不要隨便改變父函數內部變量的值。

回答5:

如果我說, set_passLine 其實就是兩個參數的函數,你能接受嗎?

def set_passLine(passline)(val): # 雖然這不符合語法 pass

這個和函數

def set_passLine(passline,val): pass

在功能上是等價的,但前者,不必一次性給出所有參數來調用。

另外,第一種寫法可以實現和類一樣的功能:

def set_passLine(passline): def cmp(val):pass def resetPassLine(newPassline):passline=newPasslinepass return (cmp,resetPassLine)

雖然這些都是相同功能的不同實現。但是人們越來越發現函數式編程比其他的方式更好,更好的意思是指在代碼量上更好,更清晰(但是對程序員的要求越來越高)。

給個鏈接吧,但是是我用 js 寫的:http://zonxin.github.io/post/...

P.S.面向對象的編程就是把,所有的“物體”看為對象,編程就是,使用對象模擬“物體”的行為,即模擬某個“世界”的運行。而函數式編程,只關心“物體”的初始狀態和“物體”經過函數之后的最終狀態,而不必關心其中的過程,編程就是處理這些函數的復合。

回答6:

我一直是這么理解的:保護內部變量,通過暴漏API進行操作。

var name='meimei'function Private(){ var name = 'leilei'; return {getName:function(){ console.log(name)},setName:function(val){ name = val;} }}var private = Private();private.getName()//'leilei'private.setName('xiaoming')private.getName()//'xiaoming'name//'meimei'//通過暴漏API來操作內部變量。jquery:(function(){... window.$=window.jquery=window.jQuery=...})//一個匿名自執行函數通過window暴漏jquery,內部變量不會受到其他全局變量的污染,只能通過$的API進行操作。

以上是個人理解

回答7:

避免變量污染,但如果是在ES6中,用let和const就可以解決這個問題了

回答8:

初級水平來看只知道1、可以訪問到局部變量2、可以一直保存在內存中

所以使用頻率不宜過高,會造成內存泄漏

回答9:

答個我印象深刻的 偏函數

function logger(logType){ return console.log.bind(console, logType); }var info = logger(’[INFO]’); var error = logger(’[ERROR]’); info(’this is an info’); // => // [INFO] this is an infoerror(’this is an error’); // => // [ERROR] this is an error

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
色88888久久久久久影院| 婷婷综合亚洲| 夜久久久久久| 五月天综合网站| 日韩免费在线| 欧美成人基地 | 性感美女一区二区在线观看| 精品国产乱码| 国产精品成人一区二区不卡| 精品国产一级| 亚洲性色av| 国产一区二区三区四区| 国产精品成人一区二区不卡| 日韩精品免费一区二区在线观看| 99久精品视频在线观看视频| 欧美亚洲国产一区| 亚洲欧洲一区| 最新国产精品| 国产精品草草| 亚洲综合电影| 亚洲女同中文字幕| 亚洲日本久久| 国产高清日韩| 91精品国产91久久久久久黑人| 黄色av一区| 日韩激情综合| 久久不见久久见国语| 国产在视频一区二区三区吞精| 中文字幕色婷婷在线视频| 亚洲福利专区| 亚洲精品欧美| 精品视频在线一区二区在线| 天堂а√在线最新版中文在线| 亚洲福利久久| 日韩中文字幕无砖| 精品国产亚洲一区二区三区大结局| 亚洲精品国产嫩草在线观看| 亚洲一区二区成人| 涩涩av在线| 久久国产免费| 欧美一区成人| 国产私拍福利精品视频二区| 亚洲国产成人二区| 91亚洲国产成人久久精品| 免费在线视频一区| 香蕉久久99| 国产高潮在线| 久久精品日韩欧美| 久久国内精品| 美女日韩在线中文字幕| 亚洲精品一区三区三区在线观看| av中文字幕在线观看第一页| 性色一区二区| 日韩精品欧美大片| 日本国产欧美| 国产精区一区二区| 日韩成人精品一区二区三区| 国产精品成人3p一区二区三区| 韩日一区二区| 亚欧成人精品| 国产激情欧美| 久久99精品久久久久久园产越南| 91一区二区| 视频一区二区中文字幕| 久久av综合| 视频一区欧美日韩| 日韩电影免费网站| 国产伦精品一区二区三区在线播放| 国产中文一区| 美腿丝袜亚洲一区| 热久久国产精品| 国产精品密蕾丝视频下载| 免费不卡中文字幕在线| 捆绑调教美女网站视频一区| 视频一区国产视频| 麻豆精品少妇| 国产va免费精品观看精品视频| 亚洲tv在线| 亚洲制服欧美另类| 快she精品国产999| 日韩va欧美va亚洲va久久| 国产精品视频一区二区三区综合| 欧美日韩一区二区三区不卡视频| 日本精品国产| 久久久久国产精品一区三寸| 蜜臀va亚洲va欧美va天堂 | 日本一区二区中文字幕| 久久福利在线| 国产精品欧美三级在线观看| 欧美福利一区| 91精品婷婷色在线观看| 国内一区二区三区| 国产极品久久久久久久久波多结野| 欧美男人天堂| 在线亚洲自拍| 精品国产精品国产偷麻豆| 天堂精品久久久久| 丝袜亚洲另类欧美| 99国产精品免费视频观看| 国产精品亚洲人成在99www| 手机精品视频在线观看| 国产精品av一区二区| 国产精品99一区二区三区| 国产精品任我爽爆在线播放| 亚洲精品欧洲| 中文字幕成人| 最新国产精品| 久久国产66| 免费精品视频在线| 欧美欧美黄在线二区| 精品91久久久久| 亚洲免费福利一区| 六月婷婷一区| 日本久久精品| 日韩一区精品字幕| 亚洲综合婷婷| 欧洲av不卡| 国产精品一级| 婷婷综合五月| 成人久久一区| 久久在线电影| 精品国产三区在线| 捆绑调教日本一区二区三区| 免费观看亚洲天堂| sm久久捆绑调教精品一区| 日韩一区二区三区免费| 亚洲先锋成人| 亚洲精品国产精品粉嫩| 欧美日本久久| 精品国产美女a久久9999| 日韩高清成人| 久久国产尿小便嘘嘘| 久久香蕉国产| 欧美va天堂| 国产精品人人爽人人做我的可爱| 欧美日中文字幕| 狠狠干综合网| 亚洲精品精选| 午夜电影一区| 国产日韩欧美在线播放不卡| 欧美激情aⅴ一区二区三区 | 麻豆精品av| 美女久久久久久 | 亚洲免费中文| 日本成人在线一区| 国产精品扒开腿做爽爽爽软件| 老鸭窝一区二区久久精品| 国产suv精品一区二区四区视频| 理论片午夜视频在线观看| 欧美高清不卡| 亚洲精品动态| 欧美a级一区二区| 日韩成人综合| 国产婷婷精品| 日精品一区二区三区| 久久99蜜桃| 欧美一区二区三区激情视频| 日韩中文欧美在线| 国产精品美女在线观看直播| 欧美日韩国产观看视频| 国产亚洲综合精品| 日韩区一区二| 在线看片国产福利你懂的| 精品成人免费一区二区在线播放| 亚洲高清影视| 日韩高清中文字幕一区| 麻豆91精品91久久久的内涵| 老牛影视精品| 五月婷婷六月综合| 亚洲毛片在线| 激情综合婷婷| 婷婷亚洲综合| 青青草91久久久久久久久| 国产精品精品| 在线精品亚洲| 精品黄色一级片| 在线亚洲欧美| 精品中文在线| 美女福利一区二区三区| 丝袜美腿亚洲一区二区图片| 老牛国内精品亚洲成av人片| 午夜日韩福利| 欧美精品不卡| 国产日韩综合| 久久av电影| 99xxxx成人网| 麻豆精品视频在线观看视频| 麻豆亚洲精品| 国产中文在线播放| 青青草91视频| 99久久亚洲精品蜜臀| 欧美午夜网站| 黑丝一区二区三区| 国产成人精品一区二区三区视频| 首页国产欧美日韩丝袜| 丝袜诱惑一区二区| 国产精品一线天粉嫩av| 亚洲高清久久| 国产麻豆精品久久| 国产亚洲精品v|