閉包問題

chuxuezhe__1發表於2020-12-17
一般來說函式內部可以訪問函式外部的變數,但外部不能訪問函式內部的變數。
如果想讓一個函式訪問另一個函式內部的變數,這就需要閉包函式。簡單來說,實現閉包就是函式巢狀函式。
有三種方式:

1.呼叫函式。例:

function a(){
    var n = 1;
    function b(){
        console.log("n:",n);
   }
   b();
}
a();

2.返回值

function a() {
    var x = 1;
    return function () {
        console.log("x:", x);
    }
}
a()();

3 .自呼叫

 function a() {
     var x = 1;
     (function () {
         console.log("x:", x);
     })()
 }
 a();

閉包在定時器傳參時的使用

定時器直接迴圈會出現以下問題:

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

結果如下:
在這裡插入圖片描述

可以使用let(塊級作用域)解決傳參問題:

for (let i = 0; i < 5; i++) {
    setTimeout(() => {
        console.log(i);
    }, 1000);
}

結果如下:
在這裡插入圖片描述

也可以使用閉包來解決:

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

結果如下:
在這裡插入圖片描述

相關文章