閉包。for迴圈內定時器無效問題解決

2022-03-21 04:12:54 字數 1439 閱讀 4744

閉包就是能夠讀取其他函式內部變數的函式。

作用:乙個是可以讀取函式內部的變數,另乙個就是讓這些變數的值始終保持在記憶體中

缺點:閉包會儲存函式中的變數在記憶體中,導致記憶體消耗大

閉包會在父函式外部改變父函式內部變數的值

前端使用非同步執行的情況有

a  定時任務:settimeout() setinterval()

b  網路請求:ajax請求 動態

載入c  時間繫結

當遇到非同步的情況時,函式的輸出結果:

for(var i = 1; i <= 5;i++),i * 1000);

} //輸出結果是6 6 6 6 6 6

因為,當執行settimeout()時,會暫時跳過這一段,放在緩衝區,當for迴圈執行結束之後,由於i是全域性變數,此時在執行console.log( i )就會是 6,而不是預期中的0 1 2 3 4 5,解決辦法通常有兩種一是使用es6中let使for迴圈中的變數變成塊兒作用域,二就是使用立即執行函式,通過函式作用域可以儲存變數的特性來將每次迴圈的變數 i 儲存到函式中。

使用let:

for( let i = 0; i <= 5; i++),i * 1000);

}// 輸出結果 0 1 2 3 4 5

使用立即執行函式(iife):

for(var i = 0; i <= 5; i++), j * 1000);

}//輸出結果0 1 2 3 4 5

閉包就是能夠讀取其他函式內部變數的函式。

作用:乙個是可以讀取函式內部的變數,另乙個就是讓這些變數的值始終保持在記憶體中

缺點:閉包會儲存函式中的變數在記憶體中,導致記憶體消耗大

閉包會在父函式外部改變父函式內部變數的值

前端使用非同步執行的情況有

a  定時任務:settimeout() setinterval()

b  網路請求:ajax請求 動態

載入c  時間繫結

當遇到非同步的情況時,函式的輸出結果:

for(var i = 1; i <= 5;i++),i * 1000);

} //輸出結果是6 6 6 6 6 6

因為,當執行settimeout()時,會暫時跳過這一段,放在緩衝區,當for迴圈執行結束之後,由於i是全域性變數,此時在執行console.log( i )就會是 6,而不是預期中的0 1 2 3 4 5,解決辦法通常有兩種一是使用es6中let使for迴圈中的變數變成塊兒作用域,二就是使用立即執行函式,通過函式作用域可以儲存變數的特性來將每次迴圈的變數 i 儲存到函式中。

使用let:

for( let i = 0; i <= 5; i++),i * 1000);

}// 輸出結果 0 1 2 3 4 5

使用立即執行函式(iife):

for(var i = 0; i <= 5; i++), j * 1000);

}//輸出結果0 1 2 3 4 5

for迴圈 js定時器 閉包 自執行函式

for迴圈 js定時器 閉包 自執行函式 前言 面試題目經常會出現這麼一道題目,請將1 10有序每隔一秒輸出。看似這個題目很簡單,但是確難倒了很多js初學者。還有跟這個類似情況,比如給五個dom新增hover事件,理想效果是列印出當前索引,知識都是列印出最後乙個值。錯誤 var len 10 for...

setinterval 必報 閉包 定時器

一 什麼是閉包?有什麼作用 什麼是閉包 閉包是定義在乙個函式內部的函式,它可以訪問父級函式的內部變數。當乙個閉包被建立時,會關聯乙個作用域 父級函式的所有內部變數的集合,這個作用域不會在父級函式執行完後立即銷毀,而是永久儲存在記憶體中,直到這個閉包被銷毀,只有通過這個閉包可以訪問 操作這個記憶體中的...

返回頂部定時器清除無效問題

在做點選 返回頂部 緩動滾到頂部的小案例中,出現了設定的定時器無法清除的bug,而且返回頂部後 滑鼠往下滾頁面也無反應。源 window.onload function else varbegin 0,end 0 timer null begin top back onclick function ...