博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js典型题--从闭包开始
阅读量:6786 次
发布时间:2019-06-26

本文共 788 字,大约阅读时间需要 2 分钟。

一个不起眼的开始

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

  这里涉及到javascript的单线程异步机制,详细介绍见    http://blog.csdn.net/alex8046/article/details/44494859

  javascrip是单线程语言,所有异步事件(计时器、鼠标事件、ajax...)在所有时间执行完毕之后才能执行,并且单线程事件几乎在同一时间内执行完毕,因此,在for循环结束后,i已经变为5,而settimeout事件在1秒之后输出5个5。

 

如果希望输出值变为  5   0,1,2,3,4 改如何进行改进?

1.闭包,将变量保存

for(var i=0;i<5;i++){        (function (j) {   //闭包,j=i            setTimeout(function () {                console.log(j)            },1000)        })(i)    }console.log(i)

 2.循环体内进行函数传参,保留变量

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

 

转载于:https://www.cnblogs.com/wykbk/p/6884557.html

你可能感兴趣的文章
mysql中[Err] 1366 - Incorrect string value: '\xE5\x8D\x问题
查看>>
Hadoop生态上几个技术的关系与区别:hive、pig、hbase 关系与区别
查看>>
Mysql用户管理(远程连接、授权)
查看>>
Coursera机器学习编程作业Python实现(Andrew Ng)—— 2.1 Logistic Regression
查看>>
前台动态增加行,并将结果打印到XML文件
查看>>
简单回溯,最少步数
查看>>
LeetCode – Refresh – Palindrome Partitioning II
查看>>
mysql线上数据库单表超过200G的处理
查看>>
生成静态页相关
查看>>
OC中ARC forbids explicit message send of release错误
查看>>
J2SE 学习记录
查看>>
VS静态编译
查看>>
个人作业——Alpha项目测试
查看>>
laravel之laravel-admin安装
查看>>
浅谈C#中的接口和抽象类
查看>>
Jmeter实现webservice的接口测试
查看>>
jmeter用BeanShell调用jar包对HTTP请求中的参数进行MD5加密
查看>>
判断页数及切换
查看>>
GraphQL ---02 GraphQL和C#结合的实战项目
查看>>
Vmware虚拟机三种网络模式详解
查看>>