自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇文章帶你了解JavaScript 函數(shù)閉包

開發(fā) 前端
本文基于JavaScript基礎(chǔ)。從函數(shù)的基本概念,(變量和全局 )。函數(shù)為什么需要閉包,使用閉包可以讓私有變量成為可能。通過案例(計(jì)數(shù)器)的講解, 以及對(duì)嵌套函數(shù)中閉包的應(yīng)用能夠更好的理解。

[[400839]]

大家好,我是前端進(jìn)階者。

JavaScript變量屬于 本地 或者 全局 范圍,使用閉包可以讓私有變量成為可能。

一、全局變量

一個(gè)函數(shù)可以訪問所有定義在函數(shù) 內(nèi)部 的變量。

  1. function myFunction() { 
  2.     var a = 4; 
  3.     return a * a; 

但是函數(shù)也可以訪問定義在函數(shù) 之外 的變量。

  1. var a = 4; //全局變量 
  2. function myFunction() { 
  3.    return a * a;  

第一個(gè)例子中,a是一個(gè)局部變量.。局部變量只能在定義的函數(shù)內(nèi)使用。

全局變量可以被頁面(和窗口)中所有腳本使用(和更改),具有相同名稱的全局變量和局部變量是不同的變量。修改一個(gè),不修改其他。

沒有關(guān)鍵字var創(chuàng)建的變量,總是全局的,即使是在函數(shù)中創(chuàng)建的。

二、變量的生命周期

全局變量只要應(yīng)用程序(窗口/網(wǎng)頁)存在,它就存在。

局部變量生命周期較短。它們?cè)诤瘮?shù)被調(diào)用時(shí)被創(chuàng)建,當(dāng)函數(shù)完成時(shí)被刪除。

三、為什么需要閉包?

假設(shè)要使用一個(gè)變量來計(jì)數(shù)某物,并且希望該計(jì)數(shù)器可用于所有函數(shù)??梢允褂靡粋€(gè)全局變量和一個(gè)增加計(jì)數(shù)器的函數(shù)。這個(gè)時(shí)候就需要閉包。

案例:一個(gè)計(jì)數(shù)器

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4. <meta charset="UTF-8"
  5. <title>項(xiàng)目</title> 
  6. </head> 
  7. <body style="background-color: aqua;"
  8. <p>使用全局變量計(jì)數(shù)</p> 
  9.  
  10. <button type="button" onclick="myFunction()">計(jì)數(shù)!</button> 
  11.  
  12. <p id="demo">0</p> 
  13.  
  14. <script> 
  15. var counter = 0; 
  16.  
  17. function add() { 
  18. return counter += 1; 
  19.  
  20. function myFunction() { 
  21. document.getElementById("demo").innerHTML = add(); 
  22.   /* the counter is now equal to 3*/ 
  23.     }  
  24. </script> 
  25. </body> 
  26. </html> 

注:

計(jì)數(shù)器只被add()函數(shù)改變。問題是,頁上的任何腳本可以改變計(jì)數(shù)器,無需調(diào)用add(),如果在函數(shù)中聲明計(jì)數(shù)器,沒有調(diào)用的時(shí)候,沒有人能改變它 add()。

  1. function add() { 
  2.    var counter = 0; //局部變量 
  3.    counter += 1; 
  4.  
  5. add(); 
  6. add(); 
  7. add(); 
  8.  
  9. // the counter should now be 3, but it does not work ! 

每次都要調(diào)用add()函數(shù),計(jì)數(shù)器被設(shè)置為1。

四、JavaScript嵌套函數(shù)

所有函數(shù)都可以訪問全局作用域。

事實(shí)上,在JavaScript中,所有函數(shù)都能訪問它們外部的變量。JavaScript支持嵌套函數(shù). 嵌套函數(shù)可以訪問它們 上面(外部) 的作用域。

實(shí)例中, 內(nèi)部函數(shù) plus() 在父函數(shù)中可以訪問 counter 變量。

  1. function add() { 
  2.    var counter = 0; 
  3.    function plus() {counter += 1;} 
  4.    plus();     
  5.    return counter; 

完整代碼:

  1. <!DOCTYPE html> 
  2. <html> 
  3. <title>項(xiàng)目</title> 
  4.  
  5. <body style="background-color: aqua;"
  6.  
  7. <h2> JavaScript嵌套函數(shù)</h2> 
  8.  
  9. <p id="output"></p> 
  10.  
  11. <script> 
  12. function outer() { 
  13. var counter = 0; 
  14.  
  15. function inner() { 
  16. counter++; 
  17. inner(); 
  18. return counter; 
  19.  
  20. document.getElementById("output").innerHTML = `計(jì)數(shù)器是: ${outer()}`; 
  21. </script> 
  22.  
  23. </body> 
  24. </html> 

如果能從外部調(diào)用plus()函數(shù),這可能已經(jīng)解決了計(jì)數(shù)器的困境,還需要找到一種方法來執(zhí)行 counter = 0 只執(zhí)行一次,需要閉包。

五、JavaScript 閉包

自調(diào)用函數(shù)

變量add被分配了自調(diào)用函數(shù)的返回值,自調(diào)用函數(shù)只運(yùn)行一次. 它將counter設(shè)置為零(0),并返回函數(shù)表達(dá)式。

  1. var add = (function () { 
  2.    var counter = 0; 
  3.    return function () {return counter += 1;} 
  4. })(); 
  5.  
  6. add(); 
  7. add(); 
  8. add(); 
  9.  
  10. // the counter is now 3 

這樣 add 變成了一個(gè)函數(shù). "精彩的" 部分是它可以在父作用域中訪問counter。

注:

這就是所謂的 JavaScript 閉包, 它使函數(shù)有“私有”變量成為可能。counter受匿名函數(shù)的作用域保護(hù), 并且只能使用add函數(shù)修改。

六、總結(jié)

本文基于JavaScript基礎(chǔ)。從函數(shù)的基本概念,(變量和全局 )。函數(shù)為什么需要閉包,使用閉包可以讓私有變量成為可能。通過案例(計(jì)數(shù)器)的講解, 以及對(duì)嵌套函數(shù)中閉包的應(yīng)用能夠更好的理解。

豐富的效果圖的展示,能夠幫助更好的去理解閉包這一概念。

希望能夠幫助你更好的學(xué)習(xí)JavaScript 。

 

責(zé)任編輯:姜華 來源: 前端進(jìn)階學(xué)習(xí)交流
相關(guān)推薦

2021-01-29 18:41:16

JavaScript函數(shù)語法

2023-06-15 10:11:08

JavaScript函數(shù)表達(dá)式

2023-07-30 15:18:54

JavaScript屬性

2021-01-26 23:46:32

JavaScript數(shù)據(jù)結(jié)構(gòu)前端

2021-03-09 14:04:01

JavaScriptCookie數(shù)據(jù)

2021-06-24 09:05:08

JavaScript日期前端

2023-09-06 14:57:46

JavaScript編程語言

2024-01-30 13:47:45

2024-04-19 14:23:52

SwitchJavaScript開發(fā)

2021-03-05 18:04:15

JavaScript循環(huán)代碼

2021-05-18 08:30:42

JavaScript 前端JavaScript時(shí)

2020-11-10 10:48:10

JavaScript屬性對(duì)象

2021-02-02 18:39:05

JavaScript

2021-06-04 09:56:01

JavaScript 前端switch

2024-05-17 16:22:25

JavaScript

2020-10-27 11:24:29

avaScript m

2021-07-02 10:00:50

JavaScriptObject 函數(shù)

2020-12-23 08:12:08

javascriptSVG腳本SVG元素

2024-08-16 15:44:53

JavaScriptWhile循環(huán)

2022-01-21 11:28:59

window瀏覽器JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)