闭包,定时器,循环

1.对于一个一般的循环,顺序输出01234

for(var i=0;i<5;i++){
console.log(i)
}

2.如果加上定时器,实现每隔两秒出现一个数字

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

你会发现出现了5个4,并且还是一起出的,原因是定时器是异步函数,外部函数执行的很快,等执行定时器时for循环已经执行完毕,i等于4,我们可以这样改

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

你又会发现,现在是出现01234,但是感觉定时器没起作用,两秒后01234一起出现,我们可以这样改

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

这样你就会发现效果实现了,每隔两秒出现一个数字

时间: 2024-11-10 05:34:36

闭包,定时器,循环的相关文章

前端(十三)—— JavaScript高级:回调函数、闭包、循环绑定、面向对象、定时器

回调函数.闭包.循环绑定.面向对象.定时器 一.函数高级 1.函数回调 // 回调函数 function callback(data) {} // 逻辑函数 function func(callback) { // 函数回调,判断回调函数是否存在 if (callback) callback(data); } func(callback); // 函数回调的本质:在一个函数中(调用函数),当满足一定条件,调用参数函数(回调函数) // 回调函数作为调用函数的参数传入,满足一定的条件,调用回调函数

swift中闭包的循环引用

首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIButton(type: .ContactAdd) bu.addTarget(self, action: "tap", forControlEvents: .TouchUpInside) view.addSubview(bu) run { print("name") sel

JavaScript利用闭包解决循环绑定事件

例子: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <button></button> <button></button> <button></button> </body> <script type="text/javasc

Xcode8的调试技能Memory Graph 实战解决闭包引用循环问题

Xcode8的调试技能又增加了一个黑科技:Memory Graph.简单的说就是可以在运行时将内存中的对象生成一张图. 那么通过一个实际项目来练习一下吧. 首先我们写了一个自定义UIView:MyView.初始化的时候接收一个没有参数也没有返回值的闭包作为参数,并存为自己的属性: typealias Action = () -> Void class MyView: UIView { var action: Action? init(action: @escaping Action) { sel

JS闭包导致循环给按钮添加事件时总是执行最后一个

加入如下脚本代码: <script> var list_obj = document.getElementsByTagName('li'); for (var i = 0; i <= list_obj.length; i++) { list_obj[i].onclick = function() { alert(i); } } </script> 运行后,奇怪的发现无论点击那个li标签,alert出的都是最后一个的内容,5 下面做下分析:因为在for循环里面指定给list_o

闭包中循环传参问题

第一次接触这个问题还是在我刚开始学js的时候,当时就是一头雾水,时隔一年多了,突然又想起了这个问题,在这个春气盎然的周末,我就坐下来研究下并把结果和大家分享下: 先看代码:demo.html<!DOCTYPE HTML> <html>  <head>   <meta charset="gbk"/>   <title>闭包循环问题</title>   <style type="text/css&quo

js中闭包for循环

var a=[]; for(var i=0;i<10;i++){ a[i]=function(){ alert(i); } } alert(i); //10 a[0](); //10 a[9](); //10 为什么a[0]到a[9]都是10,而不是我们想像中的0到9呢? 我的理解是js的作用域导致的. 首先来看参数的传递.js是按值传递的,源代码中的a[i]=function(){alert(i)},a[i]保存的是一个指向堆内存的地址(对象和方法在js中保存在堆内存中).当每一次for循环时

js for循环闭包解决循环变量i遍历值

参考:http://www.cnblogs.com/syf/archive/2012/10/04/2711828.html 如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5. [html] view plaincopyprint? <html > <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"

js闭包for循环总是只执行最后一个值得解决方法

<style> li{ list-style: none;width:40px;height: 40px;text-align:center;line-height: 40px;cursor: pointer; } </style> html代码: <ul id="uls">    <li style="background:#aaa">0</li>    <li style="backgr

Js闭包与循环

目标:点击任何一个li,提示当前点击位置 <ul> <li>第1个</li> <li>第2个</li> <li>第3个</li> <li>第4个</li> <li>第5个</li> </ul> <script> var li = document.getElementsByTagName('li'); for (var i = 0; i< li.