【发布时间】:2018-01-04 22:40:57
【问题描述】:
鉴于使用const 声明的变量无法重新分配或删除,请参阅
为什么可以在传递给.then() 的函数中为使用const 声明的变量重新分配值,该函数链接到Promise.resolve(),其中传递了const 变量,但无法重新分配@987654329 @ 函数传递给.then() 的变量链接到Promise 构造函数,其中const 变量传递给resolve() 参数Promise 构造函数resolver 函数?
"use strict"
const state = "123";
Promise.resolve(state)
.then(state => {
console.log(state); // `"123"`
state = 456; // reassign `const` variable `state` to `"456"`
return state
})
.then(state => console.log(state)) // `"456"`
// not reached
.catch(err => console.error(err.message));
{
"use strict";
const state = "123";
new Promise(resolve => {
console.log(state); // `"123"`
state = "456"; // reassign `const` variable `state` to `456`
resolve(state);
})
.then(state => {
console.log(state);
})
// `Error: Assignment to constant variable.`
.catch(err => console.error(err.message));
}
编辑,更新
为了阐明调查的基础和动机,该问题试图确定何时可以使用与 const 声明相同的标识符,以及何时无法使用该程序。本质上,尝试创建一个标识符,该标识符会在尝试为标识符分配不同值的任何范围内引发错误——无论是函数范围、块范围还是代码中的任何位置——“superconst”标识符,或者最接近当前可能的描述,具体取决于引擎。 Map 或 WeakMap 或 class 是我们目前在最新浏览器实现中最接近的吗?
【问题讨论】:
-
@loganfsmyth 函数参数在函数范围内是可变的还是可变的
const变量?const声明作为参数传递的事实是否允许重新分配原始值? -
您创建了一个名为
state的新变量作为.then()处理程序的参数,这就是您要分配的变量,并且该新变量不是const。它“遮蔽”或“覆盖”在更高范围内声明的同名const变量。将函数参数的名称从state更改为localState,您将看到分配给state并没有按照您的想法执行。 -
正如我在回答末尾所说的那样,据我所知,Javascript 没有阻止较低范围定义自己的变量的功能,该变量与较高范围的 @987654352 同名@ 变量,因此“隐藏”了更高范围的变量。这不是该语言的特征。我不理解您对
Map或WeakMap或Class的引用与此讨论或superconst的含义有关。 -
@jfriend00
WeakMap密钥只能是原始密钥,是吗?或者WeakMap实现是否有例外情况?您的答案中的文本阐明了函数参数处的标识符被排除在引发错误之外。这个概念是一个标识符的可能性,它不能引用除原始且唯一的赋值之外的任何其他值。实际上并没有期望任何结果,特别是对于问题的代码。该代码是尝试查找或创建满足上述要求的模式的尝试,或者确定该要求当前是否不可能。 -
符号可以复制到多个变量就好了。
let a = Symbol(); let b = a;然后,您可以使用a或b访问Map中的相同元素。我很高兴看到您接受了答案,因为这变成了一个漫长而曲折的讨论,而不是堆栈溢出主题的问答类型。您可能想问一个新问题,它解释了您真正想要解决的问题,尽管我怀疑这不是 Javascript 支持的东西。
标签: javascript scope ecmascript-6 promise constants