JS let/for循环问题/作用域/上下文环境随笔

遇到这么个题,结果因吹丝挺
试了一下这样结果更因吹丝挺了
???什么鬼???

setTimeout会把回调放到代码执行完毕后,再做处理,so


显然setTimeout里的1是在程序执行完毕后才执行的

所以就不难理解为什么第一张图会打印5个5了,因为不管setTimeout再快,也得在程序执行完毕后打印,而程序执行完毕时,for已经循环了5次了.....

所以呢,还有个问题,在setTimeout把方法放到任务队列之后,会不会保留上下文环境?答案是肯定的。

  • 无论函数是在哪里调用,也无论函数是如何调用的,其确定的词法作用域永远都是在函数被声明的时候确定下来的。
  • 当定义一个函数时,它实际上保存一个作用域链。
  • 当调用这个函数时,它创建一个新的对象来储存它的参数或局部变量,并将这个对象添加保存至那个作用域链上,同时创建一个新的更长的表示函数调用作用域的“链”。
  • 对于嵌套函数来说,情况又有所变化:每次调用外部函数的时候,内部函数又会重新定义一遍。因为每次调用外部函数的时候,作用域链都是不同的。内部函数在每次定义的时候都要微妙的差别---在每次调用外部函数时,内部函数的代码都是相同的,而且关联这段代码的作用域链也不相同。
好烦啊终于搞定了,这样就可以证明在使用let的情况下每次循环中声明的回调的作用域链被固定下来啦
  • 当使用var声明变量的时候,没有块级作用域,因此每次循环中声明的setTimeout的回调,是去更高一级的作用域中寻找变量i。
  • 当使用let声明变量的时候,有独立的块级作用域,因此声明setTimeout回调的时候,是在本次循环的块级作用域{}中寻找变量i。

如上图,在定义循环时,同时定义n,在回调中修改n的值以修改回调执行结果,如果是var声明的,则第一次执行的结果会对后面两次造成影响,而使用let声明n,则三次循环完全互不干扰,可知在使用let定义n时,循环定义的三个回调函数的作用域链被各自分隔开。var声明的i和let声明的i在作用域链上的位置不同。

最后总结一下:

不管是var也好,let也好,循环定义的若干个setTimeout的回调都属于同一个上级作用域,但是回调之间是独立存在的,不会相互影响;不一样的是:var和let在各自作用域链上的位置不同,var没有块级作用域,所以var所在作用域属于上级作用域;let有块级作用域,所以在for循环的时候,i的作用域被限制在了{}代码块之间,分别在三个{}中定义setTimeout回调的时候,i在作用域链中的位置分属三个回调所在的块级作用域,互不干扰。

var循环
let循环

PS:只有在调用到块级作用域中变量的时候,才会将块级作用域添加到作用域链中
PS2:三个回调并非在一个块级作用域下被依次声明,而是将块级作用域循环了三次,每次分别声明了自己作用域下的方法。
PS3:知道为什么就知道怎么影响这个块级作用域啦,引用传递可破,可知作用域变量遵循普通变量传递原则。


如何影响块级作用域

PS4:作用域链的非自己部分在函数对象被建立(函数声明、函数表达式)的时候建立,而不需要等到执行,这部分作用域链是静态的;当函数执行时,建立一个自己当次执行的作用域,然后把这个作用域与前面的作用域链关联起来

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容