@(技术笔记)[css]

学习参考网站

css 网站,可供参考

javascript学习网站

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。

步骤如下:

  1. 第一个for循环,在栈中压入带执行的方法

    setTimeout( function () {console.log(i)}, i * 1000 );

    此时i为1.
  2. 第二次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 学习闭包的更多相关文章

  1. JS基础学习——闭包

    JS基础学习--闭包 什么是闭包 闭包的定义如下,它的意思是闭包使得函数可以记住和访问它的词法范围,即使函数是在它声明的词法范围外执行.更简单来讲,函数为了自己能够正确执行,它对自己的词法范围产生闭包 ...

  2. setTimeOut和闭包

    掘金上看到一个setTimeout与循环闭包的思考题.拿过来看了下,一方面了解settimeout的运行机制,还有就是js闭包的特性.关于闭包,有如下解释: 在这里写一点我对闭包的理解.理解闭包的关键 ...

  3. 附件1:setTimeout与闭包

    我在详细图解作用域链与闭包一文中的结尾留下了一个关于setTimeout与循环闭包的思考题. 利用闭包,修改下面的代码,让循环输出的结果依次为1, 2, 3, 4, 5 for (var i=1; i ...

  4. setTimeout使用闭包功能,实现定时打印数值

    我们这次使用setTimeout来实现一个按照时间定时,依次打印数值的例子.其实在早期的时候,也是我经常犯的一个错误,或者实现这种能力,似乎js比较牵强,其实是我的错,哈哈!没能理解JS强大之处.我们 ...

  5. 当setTimeout遇到闭包

    1: function myTest(){ for(var i=0; i< 5; i++){ setTimeout(console.log(i), 0); } } myTest(); 或者比较正 ...

  6. setTimeout 与 闭包。。。

    先看下面一个比较坑的代码 for (var i=1; i<=5; i++) { setTimeout( function timer() { console.log(i); }, i*1000 ...

  7. 由一道面试题简单扩展 — setTimeout、闭包

    在一个前端公众号,看到这么一个号称简单的面试题: 1.以下程序输出什么? <script type="text/javascript"> function init() ...

  8. Swift学习--闭包中的懒加载(四)

    class ViewController: UIViewController { //格式:定义变量时前使用lazy来修饰变量,后面通过等到赋值一个闭包 // 注意点:1.必须是用var 2.闭包后面 ...

  9. Swift学习--闭包的简单使用(三)

    一.Swift中闭包的简单使用 override func viewDidLoad() { super.viewDidLoad() /** 闭包和OC中的Block非常相似 OC中的block类似于匿 ...

随机推荐

  1. 久违的phpstorm

    原文:http://www.cnblogs.com/buyucoder/p/5291771.html 原文:http://idea.lanyus.com/

  2. OC与Swift单例

    OC: +(instancetype)shareNetworkTools{ static id instance; static dispatch_once_t onceToken; //onceTo ...

  3. SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例,合并列的例子

    使用过SQL Server 2000的人都知道,要想实现行列转换,必须综合利用聚合函数和动态SQL,具体实现起来需要一定的技巧,而在SQL Server 2005中,使用新引进的关键字PIVOT/UN ...

  4. HDU 1166 敌兵布阵 线段树单点更新求和

    题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmat ...

  5. spring mvc <mvc:annotation-driven/> 自定义拦截器不走

    <mvc:annotation-driven/> 这个便签会注册2个自定义拦截器,所以导致请求过来就会自己去走注册的这2个拦截器和定义的一堆bean 但是这个便签是必须得定义的 直接贴代码 ...

  6. 分布式之Zookeeper使用

    在zookeeper中可分为单一模式和集群模式. 具体详细的配置与操作,可参见:http://blog.csdn.net/shatelang/article/details/7596007. 单一模式 ...

  7. 搭建LAMP环境注意事项

    一:安装mysql 5.5以上版本需要使用cmake 和 bison 并且需要安装ncurses 在安装MySQL完毕之后,需要覆盖 掉 /etc/my.cnf centos默认会有一个my.cnf文 ...

  8. 浅谈WEB前后端分离

    重审业务逻辑 用过MVC的童鞋都知道业务逻辑(Bussiness Logic),但是大多对这概念又是模棱两可,业务逻辑从来都是这样难以理解,谈论前后端分离之前这个概念非常有必要探讨一下! 在简单的CR ...

  9. 【leetcode】Roman to Integer

    题目描述: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range fr ...

  10. 【转载】VS2012的打包方法

    上篇博客把收费系统的总体设计进行了一遍讲解,讲解的同时掺杂了些有关.NET编译机制的总结.程序编写测试完成后接下来我们要做的是打包部署程序,但VS2012让人心痛的是没有了打包工具.不知道出于什么原因 ...