相关疑难解决方法(0)

规范中"LexicalEnvironment"和"VariableEnvironment"之间的区别是什么?

我正在阅读ECMAScript 2015规范,并且多次使用术语"LexicalEnvironment"和"VariableEnvironment".它们在表23中定义:

LexicalEnvironment:标识用于解析此执行上下文中的代码所做的标识符引用的词法环境.

VariableEnvironment:标识其EnvironmentRecord包含由此执行上下文中的VariableStatements创建的绑定的词法环境.

执行上下文的LexicalEnvironment和VariableEnvironment组件始终是Lexical Environments.创建执行上下文时,其LexicalEnvironment和VariableEnvironment组件最初具有相同的值.

所以,我想知道它们将如何不同,以及每种情况都会被使用.有人可以解释一下吗?

javascript ecmascript-6

14
推荐指数
2
解决办法
691
查看次数

为什么catch子句有自己的词汇环境?

请考虑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 scope try-catch ecmascript-5 hoisting

5
推荐指数
1
解决办法
448
查看次数

如何在JavaScript中动态地向当前执行上下文添加属性?

我正在读一本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用于跨域,长时间推送消息等等?

javascript

5
推荐指数
1
解决办法
198
查看次数