首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间死区-默认的param ReferenceError

问时间死区-默认的param ReferenceError
EN

Stack Overflow用户
提问于 2019-10-07 19:27:05
回答 3查看 60关注 0票数 2

我很难理解这两个代码块之间的区别,以及其中一个代码与另一个代码块之间的区别。我在讨论JS中的时态死区时看到了这些代码片段,但是很难理解这个默认参数的特殊情况。

抛出一个ReferenceError

代码语言:javascript
复制
// sample1.js
const a = 2;
function square(a = a) {
  return a * a;
}
// Does not work!
square();

作品

代码语言:javascript
复制
// sample2.js
const init = 2;
function square(a = init) {
  return a * a;
}
// Works!
square(); // => 4
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-07 19:42:53

这些变量位于“内部作用域”--甚至是.(a=a){.}。

内部作用域中的vars将覆盖(变量作用域/阴影)变量,在“外部作用域”中使用相同的名称。

所以当你试图把'a‘赋值给'a’--内部作用域'a‘是覆盖了变量在外部作用域中的内容时,它认为你试图分配正在被定义过程中的东西(a = a)。

看起来有点傻--因为你想要做的事情的意图是明确的,但这就是它的工作方式。

票数 1
EN

Stack Overflow用户

发布于 2019-10-07 19:30:57

看起来JS解释器认为您正在尝试将参数a (尚未定义)赋值给自己。

我不确定在这种情况下是否可以引用全局a,我只想选择另一个名称来避免误解和简化代码。例如,如果全局a是某个全局常量,则将它重命名为A。

票数 0
EN

Stack Overflow用户

发布于 2019-10-07 19:38:13

原因是您试图设置的声明范围,因为您可以看到以下代码

代码语言:javascript
复制
const a = 2;
function square(a = a) {
  return a * a;
}
// Does not work!
square();

当您这样做时,您告诉JS,必须将名为a的参数分配给同一个a,因此编译器会感到困惑,因为这个函数块的声明指向名为"a“的相同参数,因此当您试图将其赋值给另一个const名称时,编译器可以识别变量no引用当前块的相同作用域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58275952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档