在ECMAScript的5规范规定如下:
通常,词汇环境与ECMAScript代码的某些特定语法结构相关联,例如TryStatement的FunctionDeclaration,WithStatement或Catch子句,并且每次评估此类代码时都会创建新的词法环境.
如果我的理解是正确的,那么当在JavaScript中创建新的词法环境时,会输入一个新的范围,这就是为什么在函数内声明的变量在该函数之外是不可见的:
function example() {
var x = 10;
console.log(x); //10
}
console.log(x); //ReferenceError
Run Code Online (Sandbox Code Playgroud)
因此,在上面的函数声明中,创建了一个新的词法环境,这意味着x
在任何可能存在的外部词汇环境中都不可用.
因此,上面关于函数声明的引用部分似乎有意义.但是,它还声明为Try语句的Catch子句创建了一个新的词法环境:
try {
console.log(y); //ReferenceError so we enter catch
}
catch(e) {
var x = 10;
console.log(x); //10
}
console.log(x); //10 - but why is x in scope?
Run Code Online (Sandbox Code Playgroud)
那么catch
块的范围如何工作?我是否对词汇环境有什么根本的误解?
我正在阅读ECMAScript 2015规范,并且多次使用术语"LexicalEnvironment"和"VariableEnvironment".它们在表23中定义:
LexicalEnvironment:标识用于解析此执行上下文中的代码所做的标识符引用的词法环境.
VariableEnvironment:标识其EnvironmentRecord包含由此执行上下文中的VariableStatements创建的绑定的词法环境.
执行上下文的LexicalEnvironment和VariableEnvironment组件始终是Lexical Environments.创建执行上下文时,其LexicalEnvironment和VariableEnvironment组件最初具有相同的值.
所以,我想知道它们将如何不同,以及每种情况都会被使用.有人可以解释一下吗?
以下代码是JavaScript代码.我试图了解JavaScript中的函数范围并在此处阅读文章.我正在复制下面的代码 -
var cow = "purple"; // just a random cow
var f = function (x) {
var r = 0;
cow = "glue";
if (x > 3) {
var cow = 1; // a local variable
r = 7;
}
return r;
};
var z = f(2);
alert(cow); // returns purple
Run Code Online (Sandbox Code Playgroud)
我不太明白为什么字符串"紫色"会被警告.该行cow = "glue";
应将cow变量的值设置为"glue".如果我删除if块,然后在最后一个语句中警告cow,我看到字符串"glue"被警告.
当调用f(2)时,不输入if代码块并且其中没有任何内容被执行,那么为什么我会看到不同的结果呢?即为什么在最后一个语句中警告牛现在返回字符串"紫色"?
有人可以澄清这两者之间的区别,因为它们存在于执行环境中吗?我很难阅读ECMA 262 v 5规范并清楚地看到差异.
谢谢,
我正在阅读ECMA 262 5规范的执行上下文/词汇环境部分.它陈述如下:(强调添加)
词汇环境是一种规范类型,用于根据ECMAScript代码的词法嵌套结构定义标识符与特定变量和函数的关联.词汇环境由环境记录和外部词汇环境的可能空引用组成.通常,词汇环境与ECMAScript代码的某些特定语法结构相关联,例如TryStatement 的FunctionDeclaration,WithStatement或Catch子句,并且每次评估此类代码时都会创建新的词法环境.
我注意到它没有说明为函数表达式创建词法环境.是为函数表达式创建的词法环境,还是仅为函数声明创建的?我错过了什么吗?
编辑:我注意到函数代码将有自己的执行上下文,这就是为什么我也很困惑为什么在词法环境部分没有提到函数表达式.
我正在使用 JavaScript 中的 try-catch 块,并且遇到了一些我不完全理解的变量作用域行为。
我知道console.log(boo)
打印20
到控制台是因为变量已经用var
关键字声明了,因此它是功能范围的(即不是块范围到 catch 块)。
但是,我不明白为什么err
变量的范围也不与变量相同boo
。因此我不明白为什么它undefined
在 catch 块之外。
(function() {
try {
throw new Error();
} catch (err) {
var err = 10;
var boo = 20;
console.log(err); //'10' (as I expect)
}
// Why doesn’t this log '10' ???
console.log(err); // 'undefined' (but I expected '10')
console.log(boo); // '20' (as I expect)
})();
Run Code Online (Sandbox Code Playgroud)