setTimeout 学习闭包
@(技术笔记)[css]
学习参考网站
var create = function (i){
return function(){
console.log(i);
};
};
for ( var i = 0; i < 5; i++ ) {
console.log(i);
setTimeout( create(i), i * 1000 );
}
上面代码运行解释:
这是一个倒计时代码片段!
javascript的到计时代码并不是那么好写的哈。呵呵
setTimeout 是一个异步执行的函数。函数定义如下:

第一个参数是要执行的方法(function),第二个参数是延迟时间。
好的。那我们这样写会有什么结果:
for ( var i = 0; i < 4; i++ ) {
setTimeout( function () {console.log(i)}, i * 1000 );
}
输出结果为
4
4
4
4
我是这样理解的,setTimeout函数式异步函数,它会在for循环结束后执行。这时候在运行栈中的匿名函数i的值为4,所以运行的结果都为4。
步骤如下:
- 第一个for循环,在栈中压入带执行的方法
setTimeout( function () {console.log(i)}, i * 1000 );
此时i为1. - 第二次for循环,在栈中压入待执行的方法
setTimeout( function () {console.log(i)}, i * 1000 );
此时i为2。这个i是个全局变量,所以此时第一压入栈中的函数i也为2.
以下重复上面步骤,最后压入栈中待执行的函数指向的变量值都为4.
所以最终的输出结果为 上面所示。
那么我们如何才能输出4个不一样的值呢?
如何让函数保存住它的变量。
for (var i = 0; i < 4; i++) {
setTimeout(create(i), i * 1000);
}
create(i) 是执行函数create并传入参数i,这个函数会立刻执行,这个函数执行完后有一个返回值。这个返回值也是一个函数,这个函数保存了i变量,这个i变量不会变。它的作用域在这个返回的匿名函数。此时i为1.
剩下同理,函数保存了变量的值。所以这次执行结果会按照我们开始设想的那样输出:

这里用闭包保存变量的值。
setTimeout 学习闭包的更多相关文章
- JS基础学习——闭包
JS基础学习--闭包 什么是闭包 闭包的定义如下,它的意思是闭包使得函数可以记住和访问它的词法范围,即使函数是在它声明的词法范围外执行.更简单来讲,函数为了自己能够正确执行,它对自己的词法范围产生闭包 ...
- setTimeOut和闭包
掘金上看到一个setTimeout与循环闭包的思考题.拿过来看了下,一方面了解settimeout的运行机制,还有就是js闭包的特性.关于闭包,有如下解释: 在这里写一点我对闭包的理解.理解闭包的关键 ...
- 附件1:setTimeout与闭包
我在详细图解作用域链与闭包一文中的结尾留下了一个关于setTimeout与循环闭包的思考题. 利用闭包,修改下面的代码,让循环输出的结果依次为1, 2, 3, 4, 5 for (var i=1; i ...
- setTimeout使用闭包功能,实现定时打印数值
我们这次使用setTimeout来实现一个按照时间定时,依次打印数值的例子.其实在早期的时候,也是我经常犯的一个错误,或者实现这种能力,似乎js比较牵强,其实是我的错,哈哈!没能理解JS强大之处.我们 ...
- 当setTimeout遇到闭包
1: function myTest(){ for(var i=0; i< 5; i++){ setTimeout(console.log(i), 0); } } myTest(); 或者比较正 ...
- setTimeout 与 闭包。。。
先看下面一个比较坑的代码 for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log(i); }, i*1000 ...
- 由一道面试题简单扩展 — setTimeout、闭包
在一个前端公众号,看到这么一个号称简单的面试题: 1.以下程序输出什么? <script type="text/javascript"> function init() ...
- Swift学习--闭包中的懒加载(四)
class ViewController: UIViewController { //格式:定义变量时前使用lazy来修饰变量,后面通过等到赋值一个闭包 // 注意点:1.必须是用var 2.闭包后面 ...
- Swift学习--闭包的简单使用(三)
一.Swift中闭包的简单使用 override func viewDidLoad() { super.viewDidLoad() /** 闭包和OC中的Block非常相似 OC中的block类似于匿 ...
随机推荐
- 自动化运维 Expect
Mac 下载:brew install homebrew/dupes/expect expect : -> 自动化脚本工具: 用于处理交互命令; #注意 调用时并不是使用的 /bin/b ...
- memcache的内存管理探微
slab分配器:http://blog.csdn.net/luotuo44/article/details/42737181 hash操作 :http://blog.csdn.net/luotuo4 ...
- 51nod 1459 迷宫游戏 (最短路径—Dijkstra算法)
题目链接 中文题,迪杰斯特拉最短路径算法模板题. #include<stdio.h> #include<string.h> #define INF 0x3f3f3f3f ],v ...
- kettle系列-4.kettle定制化开发工具类
要说的话这个工具类还是比较简单的,每个方法体都比较小,但用起来还是可以的,把开发中一些常用的步骤封装了下,不用去kettle源码中找相关操作的具体实现了. 算了废话不多了,直接上重点,代码如下: im ...
- centos+scala2.11.4+hadoop2.3+spark1.3.1环境搭建
一.Java安装 1.安装包准备: 首先到官网下载jdk,http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads- ...
- html传值 location.search取
$(function() { var url = decodeURI(location.search); if (url.indexOf("?") != -1) { var str ...
- LinkedHashMap源码阅读笔记(基于jdk1.8)
LinkedHashMap是HashMap的子类,很多地方都是直接引用HashMap中的方法,所以需要注意的地方并不多.关键的点就是几个重写的方法: 1.Entry是继承与Node类,也就是Linke ...
- vue-loader配合webpack的使用及安装
vue-loader配合webpack的使用及安装: 工程文件简单的目录结构 index.html main.js 入口文件 App.vue vue文件,官方推荐命名法 package.jso ...
- 深入理解ConcurrentMap.putIfAbsent(key,value) 用法
转自:http://blog.csdn.net/exceptional_derek/article/details/40384659 先看一段代码: public class Locale { pri ...
- [转]svn 回退/更新/取消至某个版本命令详解
1. 取消Add/Delete 取消文件 svn revert 文件名 取消目录 svn revert --depth=infinity 目录名 2. 回退版本 方法1: 用svn merge 1) ...