闭包
来源:互联网 发布:php 画线 粗细 编辑:程序博客网 时间:2024/04/30 13:14
一道笔试题
var arr = ['第一次','第二次','第三次'];for(var i=0;i<arr.length;i++){ setTimeout(function(){ document.getElementById('info').innerHTML = arr[i]; },i*10000);}
你以为这会输出什么?小心别跳入陷阱里。
结果为:
- undefined
- 10秒后输出 undefined
- 20秒后输出 undefined
为什么呢?因为i是全局变量,当for循环执行结束后,i当然等于数组长度,所以三次结果都是第三次。实际测试结果都是undefined,因为只有当i=3的时候才结束for循环,而arr[3]表示数组的第四个元素,实际arr数组里只有三个元素,所以arr[3]也就等于undefined
使用闭包的方式解决
var arr = ['第一次','第二次','第三次'];for(var i=0;i<arr.length;i++){ (function(num){ setTimeout(function(){ document.getElementById('info').innerHTML = arr[num]; },num*10000); })(i);}
关于setTimeout执行流的问题,这里有一个栗子:
console.log(1);setTimeout(function(){console.log(2);},0);console.log(3);setTimeout(function(){console.log(4);},0);console.log(5);
执行结果
13524
以上执行结果,可以分析到虽然setTimeout得时间设置为0,但setTimeout需要等代码流执行结束后再来执行setTimeout函数块
0 0
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- 闭包
- Android上使用camera拍照,把获取的照片上传到远程服务器
- Word Ladder II☆
- java线程基本知识
- tableView选中状态编辑
- ios 上传app提示miss 64-bit support警告
- 闭包
- PHP 压缩单个或多个文件成ZIP 函数(修复)
- iOS Swift 自定义tabbar
- linux 子系统 input
- IOS——新建项目的图标和背景适配所有iPhone屏幕尺寸注意事项
- windows下python3相关numpy,scipy等数学库下载地址
- 数据结构与算法 ---- 线性表 及Java实现 顺序表、链表、栈、队列
- 九度题目1186:打印日期
- android libs文件夹中的jar包关联doc