我正在阅读ECMAScript 2015规范,并且多次使用术语"LexicalEnvironment"和"VariableEnvironment".它们在表23中定义:
LexicalEnvironment:标识用于解析此执行上下文中的代码所做的标识符引用的词法环境.
VariableEnvironment:标识其EnvironmentRecord包含由此执行上下文中的VariableStatements创建的绑定的词法环境.
执行上下文的LexicalEnvironment和VariableEnvironment组件始终是Lexical Environments.创建执行上下文时,其LexicalEnvironment和VariableEnvironment组件最初具有相同的值.
所以,我想知道它们将如何不同,以及每种情况都会被使用.有人可以解释一下吗?
请考虑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条款需要自己的词汇环境?
我正在读一本JavaScript语言的教科书.在我研究封闭主题的同时,我提出了以下问题.
考虑到这个功能:
function foo() {
extractPropsToCurrentContext({'prop1' : 'hello', 'prop2' : 123});
}
Run Code Online (Sandbox Code Playgroud)
我想要上面代码的结果,等于:
function foo() {
var prop1 = 'hello';
var prop2 = 123;
}
Run Code Online (Sandbox Code Playgroud)
那么,我的问题是,如何实现函数extractPropsToCurrentContext(/*Object*/)?
为了澄清,我想将对象的这些属性提取到执行上下文中,而不是在'this'指针下.(因此,那些提取的道具应该在该函数内部是私有的).
另外要澄清一点,你不能假设用'new'调用foo.(比如新的foo())
更新:
我的意思是,有没有可能我们可以使用任何hacky技巧来绕过浏览器的限制,更接近我们想要的结果?就像多年前一样,我们发明了JSONP用于跨域,长时间推送消息等等?