日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Javascript闭包——懂不懂由你,反正我是懂了

發布時間:2023/12/13 java 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Javascript闭包——懂不懂由你,反正我是懂了 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
摘要:“如果你不能向一個六歲的孩子解釋清楚,那么其實你自己根本就沒弄懂。”好吧,我試著向一個27歲的朋友就是JS閉包(JavaScript closure)卻徹底失敗了。

  越來越覺得國內沒有教書育人的氛圍,為了弄懂JS的閉包,我使出了我英語四級吃奶的勁去google上搜尋著有關閉包的解釋,當我看到stackoverflow上這一篇解答,我腦中就出現了一句話:就是這貨沒跑了!

  不才譯文見下,見笑了。

  Peter Mortensen問:

就像老Albert所說的,“如果你不能向一個六歲的孩子解釋清楚,那么其實你自己根本就沒弄懂。”好吧,我試著向一個27歲的朋友就是JS閉包(JavaScript closure)卻徹底失敗了。

你們會怎么把它解釋給一個充滿好奇心的六歲孩子聽呢?

注:我看過StackOverflow上給出的示例,但根本沒用。

  Ali的回答:

  當function里嵌套function時,內部的function可以訪問外部function里的變量。

function?foo(x) {
????var?tmp?=?3;
????function?bar(y) {
??????? alert(x?+?y?+?(++tmp));
??? }
??? bar(10);
}
foo(2)

  不管執行多少次,都會alert 16,因為bar能訪問foo的參數x,也能訪問foo的變量tmp。

  但,這還不是閉包。當你return的是內部function時,就是一個閉包。內部function會close-over外部function的變量直到內部function結束。

function?foo(x) { var?tmp?=?3;
????return?function?(y) {
??? ? ? alert(x?+?y?+?(++tmp));
??? }
}
var?bar?=?foo(2);?//?bar 現在是一個閉包
bar(10);

  上面的腳本最終也會alert 16,因為雖然bar不直接處于foo的內部作用域,但bar還是能訪問x和tmp。

  但是,由于tmp仍存在于bar閉包的內部,所以它還是會自加1,而且你每次調用bar時它都會自加1.

  (考慮到六歲這個限制:我們其實可以建立不止一個閉包方法,比如return它們的數組,也可以把它們設置為全局變量。它們全都指向相同的x和相同的tmp,而不是各自有一份副本。)

  注:現在來整點兒七歲的內容。

  上面的x是一個字面值(值傳遞),和JS里其他的字面值一樣,當調用foo時,實參x的值被復制了一份,復制的那一份作為了foo的參數x。

  那么問題來了,JS里處理object時是用到引用傳遞的,那么,你調用foo時傳遞一個object,foo函數return的閉包也會引用最初那個object!

function?foo(x) {
var?tmp?=?3;
return?function?(y) {
??? alert(x?+?y?+?tmp);
??? x.memb?=?x.memb???x.memb?+?1?:?1;
??? alert(x.memb);
??? }
}
var?age?=?new?Number(2);
var?bar?=?foo(age);?//?bar 現在是一個引用了age的閉包
bar(10);

  不出我們意料,每次運行bar(10),x.memb都會自加1。但需要注意的是x每次都指向同一個object變量——age,運行兩次bar(10)后,age.memb會變成2.

  這和HTML對象的內存泄漏有關,呃,不過貌似超出了答題的范圍。

  JohnMerlino 對Ali說:

  這里有一個不用return關鍵字的閉包例子:

function?closureExample(objID, text, timedelay) {?
??? setTimeout(function() {?
??????? document.getElementById(objID).innerHTML?=?text;?
??? }, timedelay);?
}?
closureExample(‘myDiv’, ‘Closure is created’,?500);

  深夜1:37 John Pick這樣回答:

  JS里的function能訪問它們的:

  1. 參數

  2. 局部變量或函數

  3. 外部變量(環境變量?),包括

3.1 全局變量,包括DOM。

3.2 外部函數的變量或函數。

  如果一個函數訪問了它的外部變量,那么它就是一個閉包。

  注意,外部函數不是必需的。通過訪問外部變量,一個閉包可以維持(keep alive)這些變量。在內部函數和外部函數的例子中,外部函數可以創建局部變量,并且最終退出;但是,如果任何一個或多個內部函數在它退出后卻沒有退出,那么內部函數就維持了外部函數的局部數據。

  一個典型的例子就是全局變量的使用。

  mykhal這樣回答:

  Wikipedia對閉包的定義是這樣的:

In computer science, a closure is a function together with a referencing environment for the nonlocal names (free variables) of that function.

  從技術上來講,在JS中,每個function都是閉包,因為它總是能訪問在它外部定義的數據。

  Since?scope-defining construction in Javascript is a function, not a code block like in many other languages,?what we usually mean by?closure?in Javascript?is a?fuction working with nonlocal variables defined in already executed surrounding function.

  閉包經常用于創建含有隱藏數據的函數(但并不總是這樣)。

var?db?=?(function() {
//?創建一個隱藏的object, 這個object持有一些數據
//?從外部是不能訪問這個object的
var?data?=?{};
//?創建一個函數, 這個函數提供一些訪問data的數據的方法
return?function(key, val) {
??? if?(val?===?undefined) {?return?data[key] }?//?get
????else?{?return?data[key]?=?val }?//?set
??? }
//?我們可以調用這個匿名方法
//?返回這個內部函數,它是一個閉包
})();

db('x');?//?返回 undefined
db('x',?1);?//?設置data['x']為1
db('x');?//?返回 1
//?我們不可能訪問data這個object本身
//?但是我們可以設置它的成員

  看了這么多外國大牛的解答,不知道你懂還是不懂,反正我是懂了。

  P.S. 發布文章之后看到@xiaotie的一篇文章,覺得有必要推薦一下,因為其剖析得更為深入。有人說應該在文章結尾對閉包進行總結,可惜小弟才疏學淺,不能給出一個精辟的總結。

  @xiaotie對閉包的總結如下:

(1)閉包是一種設計原則,它通過分析上下文,來簡化用戶的調用,讓用戶在不知曉的情況下,達到他的目的;

(2)網上主流的對閉包剖析的文章實際上是和閉包原則反向而馳的,如果需要知道閉包細節才能用好的話,這個閉包是設計失敗的;

(3)盡量少學習。

  大家學習學習。

轉載于:https://www.cnblogs.com/wuyixiaodao/p/5827595.html

總結

以上是生活随笔為你收集整理的Javascript闭包——懂不懂由你,反正我是懂了的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本中文字幕二区 | 天天摸天天舔 | 黄色在线免费网站 | 国产在线观看免费高清 | 国产精品呻吟久久 | 色婷婷久久久亚洲一区二区三区 | 国产视频69 | 青草热视频 | 黄色3级视频 | 精品久久久一区二区 | 久久久久久伊人 | 亚洲av女人18毛片水真多 | 日韩精品网址 | 午夜两性视频 | 亚洲无码久久久久 | 欧美成人另类 | 成人欧美一区二区三区在线观看 | 精品国产一区一区二区三亚瑟 | 国产经典一区二区三区 | 国产精品久久久久久一区二区 | 人妻人人澡人人添人人爽 | 亚洲一卡二卡在线观看 | 伊人久久大香线蕉 | 欧美日韩一区二区三区69堂 | 女优色图 | 丁香花高清在线 | av成人在线免费观看 | 五月丁香综合激情六月久久 | 免费观看在线观看 | 大奶在线观看 | 日啪| 九九热在线精品视频 | 波多野结衣在线观看一区 | 亚洲爱爱视频 | 91精品亚洲一区 | 欧美日韩精品三区 | 日韩成人av毛片 | 午夜黄网 | 激情文学综合网 | 亚洲乱码国产乱码精品精剪 | 日韩精品一区二区三区电影 | 久久午夜国产精品 | 久久大奶 | 99在线精品视频免费观看20 | 少妇人妻一区 | 国产一区二区三区免费观看视频 | 51成人 | 热热热色| 秘密基地动漫在线观看免费 | 中文字幕无码av波多野吉衣 | 黄色片免费在线 | av网站久久| 视频网站在线观看18 | 成人gav| 午夜啪视频 | melody在线高清免费观看 | 特黄色一级片 | 蜜桃久久av | 18成人免费观看网站下载 | 男人看片网站 | 午夜在线| 男人天堂av在线播放 | 日本调教电影 | 97人妻精品一区二区 | 欧美在线视频免费观看 | 人妻色综合网站 | 白丝美女喷水 | 逼特逼视频在线观看 | 中文字幕 视频一区 | 一区二区三区视频网站 | 激情五月婷婷色 | 国产三级视频 | 亚洲一片 | 日日干日日射 | 亚洲国产系列 | 伊人青青草 | 精品一区二区三区免费 | 蜜桃精品久久久久久久免费影院 | 国产精品999. | 在线观看国产三级 | 日色网站| 欧美人禽杂交狂配 | 美足av电影| 欧美一级片免费观看 | 亚洲字幕在线观看 | 九九热精品视频在线观看 | av在线片 | 亚洲aⅴ乱码精品成人区 | 国产精品超碰 | 国产一区二区三区视频在线观看 | 毛片视频免费 | 高清一区二区在线 | 99在线精品视频 | 中文字幕永久在线视频 | 中文字幕av免费 | 欧美在线一区二区视频 | 国产xxxxx在线观看 | av在线男人天堂 | 久久a毛片 |