摘要:閉包,一言以蔽之,就是函數和作用域鏈,通俗點就是函數內部使用了外面定義的變量。內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不能訪問內部環境的任何變量或函數。
閉包,一言以蔽之,就是函數和作用域鏈,通俗點就是函數內部使用了外面定義的變量。
我們從一個例子說起:
function foo(){ var a = 2; var b = 3; return function bar(){ console.log(a+b); } } var baz = foo(); baz();
最后的結果,控制臺會輸出a+b的值,也就是5。
在這段代碼里,出現了閉包,bar()就是函數,bar引用了外面定義的變量a和b。
那么作用域鏈又是什么呢?
來個官方解釋:(紅寶書)
當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。它的作用是保證對執行環境有權訪問的所有變量和函數的有序訪問。它的前端始終都是當前執行代碼所在環境的變量對象。
這些東西看起來好像很難理解。我們先從執行環境這個概念開始解釋。
執行環境(有時也稱作環境)定義了變量或函數有權訪問的其他數據,決定了它們各自的行為。
比如說上面的例子中,共有三個執行環境:
全局環境,有一個函數foo和一個變量baz。
foo的局部環境,有兩個變量a和b和一個函數bar。
bar的局部環境。
bar的局部環境中,沒有變量,但是它可以訪問foo的局部環境中的變量a和b。
但是在全局環境中不能直接訪問foo的局部環境中的變量a和b。因為全局環境是foo局部環境的父執行環境。
最后我們再來看作用域鏈
下圖可以形象地表示上面例子的作用域鏈
圖中的矩形表示特定的執行環境。內部環境可以通過作用域鏈訪問所有的外部環境,但外部環境不能訪問內部環境的任何變量或函數。這些環境之間是有次序的。每個環境可以向外搜索,但反之不行。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/93563.html
摘要:而閉包卻能阻止這件事情發生。由于的聲明位置使它擁有涵蓋內部作用域的閉包,使得該作用域能夠一直存在,以供在之后進行引用。到這里,小菊花課堂之閉包的內容就告一段落啦,感謝各位能耐心看到這里。 由于前段時間項目沒有那么忙,然后我這人一天不看點啥就非常焦慮,于是二刷《你不知道的JavaScript》,現在讀到閉包,想著看完這一章節,寫點東西也是挺好的,所以有了下面的內容,如有不對的地方,敬請斧...
摘要:閉包里面保存的變量只有被方法引用了的變量這個例子里,閉包里只有并沒有。那最后來說說的問題閉包到底是什么閉包是一個作用域。鑒于在的調試窗口,是放在下面的那閉包這個作用域是個什么范圍被后代方法子方法,孫子方法。。。 首先給js的作用域這個話題打標簽:2,var, 全局變量,局部變量,函數,undefined, 作用域提升,賦值不會提升,ReferenceError, 同名覆蓋。打完標簽之后...
摘要:之前一篇文章我們詳細說明了變量對象,而這里,我們將詳細說明作用域鏈。而的作用域鏈,則同時包含了這三個變量對象,所以的執行上下文可如下表示。下圖展示了閉包的作用域鏈。其中為當前的函數調用棧,為當前正在被執行的函數的作用域鏈,為當前的局部變量。 showImg(https://segmentfault.com/img/remote/1460000008329355);初學JavaScrip...
摘要:的變量作用域是基于其特有的作用域鏈的。需要注意的是,用創建的函數,其作用域指向全局作用域。所以,有另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。 作用域 定義 在編程語言中,作用域控制著變量與參數的可見性及生命周期,它能減少名稱沖突,而且提供了自動內存管理 --javascript 語言精粹 我理解的是,一個變量、函數或者成員可以在代碼中訪問到的范圍。 js的變量作...
閱讀 3098·2021-11-22 09:34
閱讀 601·2021-11-22 09:34
閱讀 2447·2021-10-08 10:18
閱讀 3384·2021-09-22 15:57
閱讀 2595·2021-09-22 15:25
閱讀 2412·2019-08-30 15:54
閱讀 2120·2019-08-30 15:44
閱讀 1805·2019-08-29 11:18