摘要:循環控制臺打印但是我們希望的結果是原因是,延遲函數的回調會在循環結束時才執行。我們改寫一下原因如果作用域是空的,那么僅僅將它們進行封閉是不夠的。
for循環:
for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log( i ); }, i*1000 ); } /* 控制臺打印: 6 6 6 6 6 6 */
但是我們希望的結果是:
1 2 3 4 5
原因是,延遲函數的回調會在循環結束時才執行。當定時器運行時即使每個迭代中執行的是setTimeout(.., 0),所有的回調函數依然是在循環結束后才會被執行,因此會每次輸出一個6 出來。
我們改寫一下:
for (var i=1; i<=5; i++) { (function() { setTimeout( function timer() { console.log( i ); }, i*1000 ); })(); } /* 6 6 6 6 6 */
原因:如果作用域是空的,那么僅僅將它們進行封閉是不夠的。它需要包含一點實質內容才能為我們所用。它需要有自己的變量,用來在每個迭代中儲存i 的值:
繼續改寫:
for (var i=1; i<=5; i++) { (function() { var j = i;//保存外部變量 setTimeout( function timer() { console.log( j ); }, j*1000 ); })(); } /* 1 2 3 4 5 */ //代碼改進:(將i當參數傳進去) for (var i=1; i<=5; i++) { (function(j) { setTimeout( function timer() { console.log( j ); }, j*1000 ); })( i ); }
總結
當函數可以記住并訪問所在的詞法作用域,即使函數是在當前詞法作用域之外執行,這時 就產生了閉包。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/92752.html
摘要:執行出來的結果是這樣的實驗發現,無論如何都在最后執行,這證實了我們之前遇到的問題,因為在循環結束才執行,所以回調函數調用的取值必然是循環的最后一次。 前言 https://developer.mozilla.org/zh-CN/docs/JavaScript/Guide/Closures MDN上描述閉包的章節闡述了一個由于閉包產生的常見錯誤,代碼片段是這樣的 for (var i...
摘要:原文鏈接在這之前先要了解一下循環中和的區別是函數級作用域或者全局作用域,是塊級作用域看一個例子循環中的邏輯代碼函數下的輸出,全局下的不存在現在我們把換為循環中的邏輯代碼報錯了,不在函數作用域下,當然肯定也不會再全局下因為和的這個區別當然和的 原文鏈接在這之前先要了解一下 for循環中let 和var的區別 var 是函數級作用域或者全局作用域,let是塊級作用域看一個例子 fu...
摘要:閉包會在父函數外部,改變父函數內部變量的值。立即執行函數立即執行函數,顧名思義,立即會執行的函數,即當讀取到該函數,會立即執行。特性使用語句聲明一個變量,該變量的范圍限于聲明它的塊中。使用聲明的變量,在聲明前無法使用,否則將會導致錯誤。 let和閉包 之前一直模模糊糊記得,let解決了某個閉包問題,想用時又不敢肯定,今天終于遇到這個問題了,那我們就一起來分析一下,什么是let,let有...
摘要:權威指南第版中閉包的定義函數對象可以通過作用域鏈相互關聯起來,函數體內部的變量都可以保存在函數作用域內,這種特性在計算機科學文獻中成為閉包。循環中的閉包使用閉包時一種常見的錯誤情況是循環中的閉包,很多初學者都遇到了這個問題。 閉包簡介 閉包是JavaScript的重要特性,那么什么是閉包? 《JavaScript高級程序設計(第3版)》中閉包的定義: 閉包就是指有權訪問另一個函數中的變...
摘要:中所有的事件綁定都是異步編程當前這件事件沒有徹底完成,不再等待,繼續執行下面的任務當綁定事件后,不需要等待執行,繼續執行下一個循環任務,所以當我們點擊執行方法的時候,循環早已結束即是最后。 概念 閉包就是指有權訪問另一個函數作用域中的變量的函數 點擊li標簽彈出對應數字 0 1...
摘要:執行返回的內部函數,依然能訪問變量輸出閉包中的作用域鏈理解作用域鏈對理解閉包也很有幫助。早期的版本里采用是計數的垃圾回收機制,閉包導致內存泄露的一個原因就是這個算法的一個缺陷。 關于閉包,我翻了幾遍書,看了幾遍視頻,查了一些資料,可是還是迷迷糊糊的,干脆自己動手來個總結吧 !歡迎指正... (~ o ~)~zZ 1. 什么是閉包? 來看一些關于閉包的定義: 閉包是指有權...
閱讀 3454·2021-11-22 12:00
閱讀 671·2019-08-29 13:24
閱讀 2905·2019-08-29 11:31
閱讀 2587·2019-08-26 14:00
閱讀 3185·2019-08-26 11:42
閱讀 2476·2019-08-23 18:31
閱讀 798·2019-08-23 18:27
閱讀 2844·2019-08-23 16:58