为了账号安全,请及时绑定邮箱和手机立即绑定

js作用链的疑惑

js作用链的疑惑

摇曳的蔷薇 2019-03-05 15:39:16
(function(){    console.log(bar);    console.log(baz);        bar = 20;    console.log(window.bar);    console.log(bar);        function baz(){        console.log("baz");    }    })()当代码执行到"console.log(bar);"的时候,会去AO中查找"bar"。函数中的"bar"并没有通过var关键字声明,所有不会被存放在AO中。但是为什么不会去global上面去找呢?网上说这种变量是,只是给Global添加了一个属性,并不在VO中,求解释
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

题主问题:但是为什么不会去global上面去找呢?
回答:因为第一次执行到

console.log(bar);

这个的时候,

bar = 20;

这个还没执行,所以上面访问会报错
这句代码执行后,才会在全局创建一个 bar,作为全局对象的属性存在,然后你才可以访问.
题主可以看下下面测试,这个,第一次执行,把上面代码注释掉,就不会报错,接着执行第二次,不注释代码,也不会报错,这是因为第一次执行的时候前面那句 bar = 20 执行过了;

https://img1.sycdn.imooc.com//5c836c280001812703020519.jpg

题主可能还有疑问,function baz 不是也在后面么,他可以提前访问,是因为 函数声明语句和 var 变量声明会在 代码执行之前 提前到所在函数环境或全局作用域的顶部,其中 var 声明提前仅仅是 var 提前,实际赋值保留在原地,函数声明提前是全部提前,这个可以另行百度,不过推荐看经典书籍,JavaScript权威指南-第6版-中


查看完整回答
反对 回复 2019-03-09
?
互换的青春

TA贡献1797条经验 获得超6个赞

如果变量与执行上下文相关,那变量自己应该知道它的数据存储在哪里,并且知道如何访问。这种机制称为变量对象(variable object)。 变量对象(VO)是一个与执行上下文相关的特殊对象,它存储着在上下文中声明的以下内容: 1.变量 (var, 变量声明); 2.函数声明(FunctionDeclaration, 缩写为FD); 3.函数的形参。在函数上下文中,变量对象被表示为活动对象AO。当函数被调用后,这个特殊的活动对象就被创建了。它包含普通参数与特殊参数对象(具有索引属性的参数映射表)。在函数执行上下文中,VO是不能直接访问的,此时由活动对象(activation object,AO)扮演VO的角色。
这里的bar并没有用var声明,并不是变量,并不在变量对象(VO)中,因而在函数执行时,也不会被活动对象AO所包含。

查看完整回答
反对 回复 2019-03-09
  • 2 回答
  • 0 关注
  • 511 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号