为什么Javascript显示带有setTimeout函数同步和异步的输出
why Javascript showing output with setTimeout function sync and async?
for(var i = 2;i >= 1;i--) {
setTimeout(function (i) {
console.log(i);
},1000);
console.log("hii");
}
这段代码给我的输出为
-
嗨
-
嗨
-
定义
-
定义
其中,在以下格式中使用 setTimeout 后给出不同的输出
for(var i = 2;i >= 1;i--) {
setTimeout(print(i),5000);
console.log("hii");
}
function print(i) {
console.log(i);
}
这段代码给我的输出为
-
阿拉伯数字
-
嗨
-
1
-
嗨
我不明白为什么在第二种情况下代码同步执行。
因为您在那里调用了 print
函数,所以它不会作为回调传递。在这种情况下,它将完成print
函数的执行,然后将返回值作为第一个参数传递给 setTimeout。
这就是您正在尝试的:-
for(var i = 2;i >= 1;i--) {
setTimeout(print(i),5000);
console.log("hii");
}
function print(i) {
return function(){console.log(i)}
}
在第一个示例中,您传递的函数采用单个参数,i
setTimeout ,但 setTimeout 在调用该函数(或与此相关的任何函数(时不会将任何参数传递给该函数(或与此相关的任何函数(。因此,i
在该函数中未定义,因此输出undefined
。
在第二个示例中,您调用 print,并将结果传递给 setTimeout。但是打印是立即执行的,所以这就是为什么每次迭代在"hii"之前输出一个数字的原因。
for(var i = 2;i >= 1;i--) {
setTimeout(function (i) {
console.log(i);
},1000);
console.log("hii");
}
Javascript 有一个函数级的作用域,而不是一个块级作用域。 因此,当您在 for 循环中调用 setTimeout
时,如下所示:
setTimeout(function (i) {
console.log(i);
},1000);
发生的情况是引入一个局部变量i
该变量尚未设置为任何值,因此它在 JS 中返回undefined
。
第二个代码段中,执行回调并返回打印在屏幕上的值
相关文章:
- 异步获取数据使用JavaScript同步获取数据
- javascript函数中的异步与同步.(Node.js)
- strongloop script.js run find in before delete方法:如何同步运行异步方法
- 如何模拟同步ajax调用?(基于异步的同步)
- 为什么同步睡眠功能没有被承诺内异步化
- 如何在异步函数与Deferredjquery之间同步
- 使用模态库从嵌套的异步调用中生成javascript同步代码
- 将数据发布到iframe是同步还是异步
- 节点.js / 续集.js / 快递.js - 如何插入多对多关联?(同步/异步?
- NodeJS中的异步与同步
- javascript如何成为一种同步语言并在浏览器和node.js环境中异步运行
- 如何同步2个异步瀑布
- 异步函数调用是否可以在两个同步语句之间完成
- 同步异步创建的承诺
- 同步/异步AJAX函数的模式
- 如何在 javascript 中同步异步方法
- 设置同步/异步函数序列的正确方法,所有这些函数都可以停止表单提交和进一步处理
- 浏览器呈现和javascript执行的同步/异步特性
- javascript中异步回调的结构:同步异步
- jQuery按顺序同步异步请求