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