javascript中for循环里面套定时器,始终打印结束值原因
Javascript
中变量可以存放两种类型的值,一种为原始值(primitive value
),如 Undefined, Null, Boolean, Number, String
。这类值存放在栈内部,每赋值一次就创建一个新的拷贝。另一种为引用值(reference value)
,这类值存在堆内存中,只能通过引用赋值。举例说明:
- var a = 'test';//原始值
- var b = function() {}; //引用值
我们来测试下:
- var a = 'test';//原始值
- var b = function() {}; //引用值
- b.a = 'test';
- function change(m, n) {
- m = 'change';
- n.a = 'change';
- }
- change(a, b);
现在变量 a
仍然是 test
,但是 变量 b
的属性 a
的值则已经为 change
,这也就是说前者相当于是拷贝了一份值,而后者则是引用赋值。
而闭包问题我是这样理解的,因为 Javascript
只有两种作用域,一是全局作用域,二是函数作用域,它是没有块级作用域的。所以闭包的出现就相当于利用一个匿名函数的壳模拟出一个块级作用域。举个更明显的闭包例子:
- for(var i = 0; i < 10; i++) {
- (function(e) {
- setTimeout(function() {
- console.log(e);
- }, 1000);
- })(i);
- }
连着上面的知识,这里往匿名函数内部传的参数将会被拷贝一份,也就是说循环没执行一次就拷贝变量 i
的值到匿名函数内部。
这里如果没有闭包的话:
- for(var i = 0; i < 10; i++) {
- setTimeout(function() {
- console.log(i);
- }, 1000);
- }
由于变量 i
直接暴露在全局作用域内,当调用 console.log
函数开始输出时,这是循环已经结束,所以会输出10个10。
这是我对题主问题的理解,希望能对题主有帮助,可能还有不完善的地方,我打算写篇博文好好总结下。
javascript中for循环里面套定时器,始终打印结束值原因相关推荐
- javascript中for循环和setTimeout同时使用,出现的问题
javascript中for循环和setTimeout同时使用,出现的问题 for循环代码 <!DOCTYPE html> <html lang="en"> ...
- python中一个对象只能被一个变量引用吗_Python中for循环里的变量无法被引用的解决方法...
在之前的编程语言里,学到for循环里面是可以重置变量i的值的,然后让整个for循环从头开始,但是在python里面却行不通这是为什么呢? 在python中,for循环相当于一个迭代器(Iterator ...
- JavaScript中的循环语句-while循环
-JavaScript中有三种循环语句,分别为while循环,do-while循环和for循环. 现在来聊一聊while循环. 首先讲一讲 if 语句和while 循环的格式是非常相似的,但是它们都拥 ...
- JavaScript中事件循环的理解 Event Loop
为了解决单线程运行阻塞问题,JavaScript用到了计算机系统的一种运行机制,这种机制就叫做事件循环(Event Loop) 事件循环(Event Loop) 在JavaScript中,所有的任务都 ...
- javascript中while循环、do....while与for循环的用法和区别
while语法: 1.while语法: while(循环条件){ 循环主体; } 计算表达式的值,当值为真(非0)时,则 执行循环体语句. 例: <script type="text/ ...
- continue语句只用于循环语句中_循环里continue,break,return的作用,你知道吗?
循环里continue,break,return的作用,你知道吗?mp.weixin.qq.com 前言 循环里Continue,Break,Return经常会用到,也是很容易出错的一个坑,今天特地 ...
- Javascript中for循环
在ECMAScript5(简称 ES5)中,有三种 for 循环,分别是: 简单for循环 for-in forEach 在2015年6月份发布的ECMAScript6(简称 ES6)中,新增了一种循 ...
- Javascript中的循环变量声明,到底应该放在哪儿?
不放走任何一个细节.相信很多Javascript开发者都在声明循环变量时犹 豫过var i到底应该放在哪里:放在不同的位置会对程序的运行产生怎样的影响?哪一种方式符合Javascript的语言规范?哪 ...
- Javascript中for循环别名
无意间看到这个列子,想起来了Javascript中的给循环起别名来控制循环终止 贴出来分享一下: test:for (var i = 0; i < 10; i++) { switch (i) { ...
- js代码中for循环里绑定onclick事件报错Uncaught TypeError Cannot set properties of undefined (setting ‘className‘)
jsfor循环里绑定onclick事件报错Uncaught TypeError Cannot set properties of undefined (setting 'className') 我想要 ...
最新文章
- LaTex公式编辑方法
- 【题解】 CF718C Sasha and Array
- python连接linux服务器并使用命令_python基于paramiko模块实现远程连接Linux虚拟机(服务器)并执行指定命令返回输出结果...
- shell实例第17讲:连续输入4个100以内的数字,统计和、乘、平均、最小和最大
- 【数理知识】《矩阵论》方保镕老师-第7章-几类特殊矩阵与特殊积
- 利剑无意之JAVA面试题(一)
- 删除可视图中的类不能彻底避免它重新被编译
- php给点击的li设置样式,两种方法为LI列表前3行设置样式
- 关于重分类工具的其他讨论
- teamview外网连接服务器虚拟主机,利用路由器端口映射+桥接虚拟机搭建个人服务器...
- matlab crg格式,MatLab和FlightGear环境的配置及样例
- 详解IT服务管理(ITSM)流程五阶段
- 马尔可夫链与隐马尔可夫模型
- 如何在OpenStack-Ansible上集成Tungsten Fabric
- 【数据库认证】OCM准备及考试经验总结
- 自学mysql教程 资料_数据库MYSQL,自学,命令,教程。
- win10 自动同步时间脚本
- 俄罗斯方块游戏系统-c语言版
- 高德地图面积计算公式
- bugku-告诉你个秘密