成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇文章帶你了解JavaScript 函數閉包

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

[[400839]]

大家好,我是前端進階者。

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

一、全局變量

一個函數可以訪問所有定義在函數 內部 的變量。

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

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

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

第一個例子中,a是一個局部變量.。局部變量只能在定義的函數內使用。

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

沒有關鍵字var創建的變量,總是全局的,即使是在函數中創建的。

二、變量的生命周期

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

局部變量生命周期較短。它們在函數被調用時被創建,當函數完成時被刪除。

三、為什么需要閉包?

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

案例:一個計數器

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4. <meta charset="UTF-8"
  5. <title>項目</title> 
  6. </head> 
  7. <body style="background-color: aqua;"
  8. <p>使用全局變量計數</p> 
  9.  
  10. <button type="button" onclick="myFunction()">計數!</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> 

注:

計數器只被add()函數改變。問題是,頁上的任何腳本可以改變計數器,無需調用add(),如果在函數中聲明計數器,沒有調用的時候,沒有人能改變它 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 ! 

每次都要調用add()函數,計數器被設置為1。

四、JavaScript嵌套函數

所有函數都可以訪問全局作用域。

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

實例中, 內部函數 plus() 在父函數中可以訪問 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>項目</title> 
  4.  
  5. <body style="background-color: aqua;"
  6.  
  7. <h2> JavaScript嵌套函數</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 = `計數器是: ${outer()}`; 
  21. </script> 
  22.  
  23. </body> 
  24. </html> 

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

五、JavaScript 閉包

自調用函數

變量add被分配了自調用函數的返回值,自調用函數只運行一次. 它將counter設置為零(0),并返回函數表達式。

  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 變成了一個函數. "精彩的" 部分是它可以在父作用域中訪問counter。

注:

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

六、總結

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

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

希望能夠幫助你更好的學習JavaScript 。

 

責任編輯:姜華 來源: 前端進階學習交流
相關推薦

2021-01-29 18:41:16

JavaScript函數語法

2023-06-15 10:11:08

JavaScript函數表達式

2023-09-06 14:57:46

JavaScript編程語言

2021-05-18 08:30:42

JavaScript 前端JavaScript時

2021-06-24 09:05:08

JavaScript日期前端

2021-01-26 23:46:32

JavaScript數據結構前端

2021-03-05 18:04:15

JavaScript循環代碼

2021-03-09 14:04:01

JavaScriptCookie數據

2024-04-19 14:23:52

SwitchJavaScript開發

2023-07-30 15:18:54

JavaScript屬性

2024-01-30 13:47:45

2020-11-10 10:48:10

JavaScript屬性對象

2021-06-04 09:56:01

JavaScript 前端switch

2021-02-02 18:39:05

JavaScript

2020-10-20 15:37:48

了解JavaScrip

2020-10-22 09:08:34

JavaScript

2020-10-27 11:08:01

JavaScript

2020-10-27 11:24:29

avaScript m

2021-05-25 10:15:20

JavaScript 前端作用域

2021-06-22 10:12:37

JavaScript 前端While 循環
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天天拍天天操 | 久久av一区二区三区 | 日韩中文字幕 | 精品乱码一区二区 | 操操日| 全免费a级毛片免费看视频免 | 伊人久久伊人 | 欧美性乱| 99久久精品免费 | 成人1区2区 | 99只有精品 | 国产欧美在线一区 | aacc678成免费人电影网站 | 欧美日韩一区二区三区不卡视频 | 日韩中文字幕在线视频 | 国产剧情一区 | 91精品久久久久久久久 | 一区二区亚洲 | 99久久精品国产一区二区三区 | 人人干人人草 | 亚洲婷婷一区 | 色婷婷久久综合 | 逼逼网| 国产精品久久久久久久午夜 | 日日操夜夜摸 | 亚洲啊v在线 | 毛片一区二区三区 | 91在线观看视频 | 亚洲一级在线 | 日韩精品久久 | 久久精彩 | 国产精品久久9 | 欧美一级欧美三级在线观看 | 日韩精品在线观看视频 | 天天爽天天干 | 一区二区三区精品视频 | 成人影院网站ww555久久精品 | 精品国产乱码久久久久久中文 | 91精品国产综合久久婷婷香蕉 | 日本一区二区三区精品视频 | 国产精品一区二区av |