語法
for ([initialization]; [condition]; [final-expression]) { statement }
initialization
一個(gè)表達(dá)式 (包含賦值語句) 或者變量聲明。典型地被用于初始化一個(gè)計(jì)數(shù)器。該表達(dá)式可以使用var或let關(guān)鍵字聲明新的變量,使用var聲明的變量不是該循環(huán)的局部變量,而是與for循環(huán)處在同樣的作用域中。用let聲明的變量是語句的局部變量。該表達(dá)式的結(jié)果無意義。注意此處的let 和 var 聲明表達(dá)式的不同點(diǎn)
condition
一個(gè)條件表達(dá)式被用于確定每一次循環(huán)是否能被執(zhí)行。如果該表達(dá)式的結(jié)果為true, statement 將被執(zhí)行。 這個(gè)表達(dá)式是可選的。如果被忽略,那么就被認(rèn)為永遠(yuǎn)為真。如果計(jì)算結(jié)果為假,那么執(zhí)行流程將被跳到for語句結(jié)構(gòu)后面的第一條語句。
final-expression
每次循環(huán)的最后都要執(zhí)行的表達(dá)式。執(zhí)行時(shí)機(jī)是在下一次condition的計(jì)算之前。通常被用于更新或者遞增計(jì)數(shù)器變量。
statement
只要condition的結(jié)果為true就會被執(zhí)行的語句。 要在循環(huán)體內(nèi)執(zhí)行多條語句,使用一個(gè)塊語句({ ... })來包含要執(zhí)行的語句。沒有任何語句要執(zhí)行,使用一個(gè)空語句(;)。 可以使用break 主動跳出循環(huán)
初始化中使用var聲明的變量不是該循環(huán)的局部變量,而是與for循環(huán)處在同樣的作用域中,使用let聲明的則在局部變量中
初始化塊中的表達(dá)式都是可以省略的,如果省略則需要在語句塊中設(shè)置跳出條件,避免進(jìn)入死循環(huán)
在for循環(huán)內(nèi)部使用異步函數(shù)、閉包等時(shí)的問題:
setTimeOut等異步函數(shù)時(shí):
var arr = [1,3,5,7,9]; for (var i = 0; i < arr.length-1; i++) { setTimeout(function() { console.log("循環(huán)的值:"+i); console.log("數(shù)組對應(yīng)的值:"+arr[i]); }, 1000); }
存在閉包時(shí):
function box() { var arr = []; for (var i = 0; i < 5; i++) { arr[i] = function () { return i; //由于這個(gè)閉包的關(guān)系,他是循環(huán)完畢之后才返回,最終結(jié)果是4++是5 } //這個(gè)匿名函數(shù)里面根本沒有i這個(gè)變量,所以匿名函數(shù)會從父級函數(shù)中去找i, } //當(dāng)找到這個(gè)i的時(shí)候,for循環(huán)已經(jīng)循環(huán)完畢了,所以最終會返回5 return arr; } let boxArr = box(); console.log(boxArr[0]())
這時(shí),會產(chǎn)生與我們預(yù)期所想得到的效果不同的結(jié)果,導(dǎo)致出現(xiàn)這種情況的原因主要是 for語句表達(dá)式中初始化中的變量不是該循環(huán)的局部變量(子作用域),而是與for循環(huán)處在同樣的作用域中(父作用域)。
因此,解決方案比較流行的有兩種:
第一種:使用let 替代 var 聲明for循環(huán)的表達(dá)式(推薦)
function box() { var arr = []; for (let i = 0; i < 5; i++) { arr[i] = function () { return i; } } return arr; } let boxArr = box(); console.log(boxArr[0]())
var arr = [1,3,5,7,9]; for (let i = 0; i < arr.length-1; i++) { setTimeout(function() { console.log("循環(huán)的值:"+i); console.log("數(shù)組對應(yīng)的值:"+arr[i]); }, 1000); }
第二種:使用自執(zhí)行函數(shù)利用閉包特性來達(dá)到效果:
var arr = [1, 3, 5, 7, 9]; for (var i = 0; i < arr.length ; i++) { (j=>{ setTimeout(() =>{ console.log("循環(huán)的值:" + j); console.log("數(shù)組對應(yīng)的值:" + arr[j]); }, 1000); })(i) }
function box() { var arr = []; for (var i = 0; i < 5; i++) { ((j)=>{ arr[j] = ()=> j; })(i); } return arr; } let boxArr = box(); console.log(boxArr[0]()) console.log(boxArr[1]())
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/104108.html
摘要:如圖遍歷數(shù)組遍歷數(shù)組元素并以某種方式處理每個(gè)元素是一個(gè)常見的操作。如圖不過,里的功能比較強(qiáng)大,可以遍歷而且返回值是的則被省略掉總結(jié)遍歷對象,遍歷出來的是鍵名,而不是鍵值,參數(shù)必須是對象。 可能是由于職業(yè)的關(guān)系,下班之后完全不想Open PC,但很多知識點(diǎn)有必要自己做個(gè)小小總結(jié)。本人之前對原生Array和Object完全沒概念。 遍歷對象的方法: Object.keys(Object)...
摘要:異步那些事一基礎(chǔ)知識異步那些事二分布式事件異步那些事三異步那些事四異步那些事五異步腳本加載事件概念異步回調(diào)首先了講講中兩個(gè)方法和定義和用法方法用于在指定的毫秒數(shù)后調(diào)用函數(shù)或計(jì)算表達(dá)式。功能在事件循環(huán)的下一次循環(huán)中調(diào)用回調(diào)函數(shù)。 JS異步那些事 一 (基礎(chǔ)知識)JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers...
摘要:一個(gè)對象如果要有可被循環(huán)調(diào)用的接口,就必須在的屬性上部署遍歷器生成方法原型鏈上的對象具有該方法也可。阮大神案例上面代碼是一個(gè)類部署接口的寫法。屬性對應(yīng)一個(gè)函數(shù),執(zhí)行后返回當(dāng)前對象的遍歷器對象。 最近看阮一峰阮大神的ES6,剛剛看到Iterator和for...of循環(huán)這一章,小作筆記跟大家略微分享一下,不足之處還望大家多多指正 Iterator(遍歷器)就是一種機(jī)制;任何數(shù)據(jù)結(jié)構(gòu)只要是...
摘要:委托上面的代碼結(jié)合了構(gòu)造函數(shù)和原型兩種方式去創(chuàng)建對象,首先聊聊構(gòu)造函數(shù)構(gòu)造函數(shù)構(gòu)造函數(shù)本質(zhì)上還是函數(shù),只不過為了區(qū)分將其首字母大寫了而已。注意注釋掉的代碼是自動執(zhí)行的,但這并不是構(gòu)造函數(shù)獨(dú)有的,每個(gè)函數(shù)在聲明時(shí)都會自動生成。 首先看看下面兩個(gè)1+1=2的問題: 問題一:為什么改變length的值,數(shù)組的內(nèi)容會變化? var arr = [1]; arr.length = 3; aler...
摘要:概述本篇主要介紹的運(yùn)行機(jī)制單線程事件循環(huán)結(jié)論先在中利用運(yùn)行至完成和非阻塞完成單線程下異步任務(wù)的處理就是先處理主模塊主線程上的同步任務(wù)再處理異步任務(wù)異步任務(wù)使用事件循環(huán)機(jī)制完成調(diào)度涉及的內(nèi)容有單線程事件循環(huán)同步執(zhí)行異步執(zhí)行定時(shí)器的事件循環(huán)開始 1.概述 本篇主要介紹JavaScript的運(yùn)行機(jī)制:單線程事件循環(huán)(Event Loop). 結(jié)論先: 在JavaScript中, 利用運(yùn)行至...
閱讀 1387·2021-09-24 10:26
閱讀 1697·2019-08-30 14:14
閱讀 2108·2019-08-29 16:54
閱讀 367·2019-08-29 14:09
閱讀 1478·2019-08-29 12:55
閱讀 934·2019-08-28 18:13
閱讀 1584·2019-08-26 13:39
閱讀 2571·2019-08-26 11:43