在秒。10.3将执行上下文的组件描述如下:
执行上下文的LexicalEnvironment和VariableEnvironment组件始终是Lexical Environments。创建执行上下文时,其LexicalEnvironment和VariableEnvironment组件最初具有相同的值。VariableEnvironment组件的值永远不会更改,而LexicalEnvironment组件的值可能会在执行上下文中的代码执行期间更改。
好吧,让我们有代码片段:
{
alert(o.prop);
var o={prop: 'prop'};
}
当控制权转移到此代码段时,将创建相应的执行上下文并将其推送到堆栈。该上下文将成为运行中的执行上下文(称为cont
)。在cont
创建期间VariableEnvironment
,cont
正在创建中。在之后cont
的创作这段代码开始执行。
但正如第10.3节所述
VariableEnvironment组件的值永不变
因此,我们可以假设VariableEnvironment
创建以后永不改变cont
。IE的环境记录cont
的VariableEnvironment
包含所有具有约束力的创建VariableStatement
和FunctionDeclarartion
初步。因此,我们可以通过引用将其应用于对象o
。但是我有TypeError: o is undefined
。
问题:为什么TypeError
,上述原因引起的?我希望prop
它将与警报消息一起显示,因为the value of the VariableEnvironment component never changes
因此环境记录VariableEnvironment
从不更改,因此该记录的所有绑定都是不可变的。
我可能不理解value of EnvironmentRecord
正确的意思吗?
首先,您的代码只是定义一个block,而JavaScript没有block范围。环境记录与全局范围和功能相关,而不与块相关。
因此,我们假设它实际上是一个函数,因此它将创建一个新的作用域和环境记录:
function foo()
{
alert(o.prop);
var o={prop: 'prop'};
}
完全就像是这样对待:
function foo()
{
var o;
o = undefined;
alert(o.prop);
o={prop: 'prop'};
}
哪个应该澄清一点。:-)您试图取消引用,o
就像它引用了一个对象一样,但是还没有(还);它的值是undefined
。
这是因为在完成任何分步工作之前var
,所有声明都会在进入执行上下文时进行处理,并且所有变量都将初始化为undefined
。与(例如)关联的任何初始化程序实际上都是一个赋值,并且稍后在逐步执行代码时到达该代码时发生。var
var o = ...
更多(在我的博客上):
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句