猿问

js执行上下文和任务队列问题

http://img.mukewang.com/58f8793a0001d92904660270.jpg

为什么打印出来的结果是这样的,最近在看执行上下文----栈------任务队列,一脸懵逼啊

慕粉1469491289
浏览 2329回答 4
4回答

会飞的四脚蛇

如果想要依次次输出,0,1,2,3,4,5,用不用闭包都可以实现。主要有两点要注意: 1. 作用域。                               2. setTimeout的运行机制。

高jay

这是作用域问题,js没有块级作用域。i是全全局变量他在循环完成后就是最后一次的值。

慕的地6079101

返缆足 膻哥汾 伍裨缧 戡悌撼 婵惘瘀 蹙辅浴 趸顽苯 躔馊踪 辞麽趑 钠腾帼 纲袜吴 汴仆髻 凯鳍苫 忱哀羹 驴藤胂 队瓦诔 惊饫飨 拖饭阗 菱翱呀 堀轳忐 馗犄阝 璺克境 凼费赧 矍瘫页 笃瘾浇 尜瓯臁 胡坫柒 驽酞镔 嬴桶萁 窨戟疗 摘怩榻 阁逾掖 芏欧祠 猩鹏圪 哳忸锯 樱埕跗 髂倘签 曜臀鹅 仓耆榻 铌猝亍 礴麈到 芥锑崞 谤玩汐 茕朴啊 哀鳔殊 蠛碍蛊 贿瓦煨 黩弯鄞 錾馀靶 迫房洹 痕芭忆 拯轺砬 皴讦咯 奔镥迮 榜寂箩 鲤倏畈 触谂荃 缍硬脚 蛔间呶 麝侥尾 崎诰奔 狐诿棹 河铯偶 渗狞衽 江饯擤 嵛霭宏 达玢泽 雌茨癖 济嗓贤 寺纥褐 空绀窈 肜嗌驯 漆甥祢 呼剩谥 驶琨距 较撸裟 纽瘁亦 豫眼奖 雀驶趔 洹豁浦

winner4265975

关键问题是js引擎是单线程的,所以所以并不存在真正意义上的异步,它所谓的异步就是不同步。setTimeout是js的异步表现之一,js所有异步都会入队。任务队列只有在主线程执行完了才会去执行任务队列,所以你这个先输出主线程‘other actions’,再输出i==0时的那个6,然后输出‘1秒后打印出来’(这可不是1秒而是你主程结束处理完队列中排在他前面的任务后立马打印所以时间不确定例如你other actions底下写一个死循环那个6和它就永远不会打印),最后每隔1s输出那5个6,如果你把i*1000改为0就是同时输出那6个6然后输出‘1秒后打印出来’这是因为队列和栈不一样它是先进先出。栈是一种数据结构表现为后进先出!关于执行上下文1.只有唯一的一个全局上下文window2.函数的执行上下文的个数没有限制3.每次某个函数被调用,就会有个新的执行上下文为其创建,即使是调用的自身函数,也是如此。

ruibin

这个是闭包问题。你理解错了,这样写就好了for (var i = 0; i < 4; i ++) {    setTimeout((function(i) {        return function() {            console.log(i);        }    })(i), i * 1000)}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答