请考虑ECMA-262 v5.1的以下摘录(我最近在这个问题中看到过):
词汇环境是一种规范类型,用于根据ECMAScript代码的词法嵌套结构定义标识符与特定变量和函数的关联.词汇环境由环境记录和外部词汇环境的可能空引用组成.通常,词汇环境与ECMAScript代码的某些特定语法结构相关联,例如TryStatement的FunctionDeclaration,WithStatement或Catch子句,并且每次评估此类代码时都会创建新的词法环境.
我认为这意味着catch子句的主体会像函数那样提升自己的变量,但显然情况并非如此:
var a = 1;
try {
console.log(x); // ReferenceError
} catch(ex) {
console.log(a); // 1, not undefined
var a = 3;
}
Run Code Online (Sandbox Code Playgroud)
有人知道为什么吗?另外,为什么一个catch条款需要自己的词汇环境?
在这段代码中,我希望它打印I love Java. 但是var是函数作用域。出于这个原因,它被提升到顶部并看到它被定义。所以我希望答案是JavaScript但机智输出Java,为什么?
var lang1 = 'Java'
var lang2 = 'JavaScript'
function getLanguage(){
if(!lang2){
var lang2 = lang1
}
return lang2
}
console.log(`I love ${getLanguage()}`)Run Code Online (Sandbox Code Playgroud)