繁体   English   中英

不能使用 let 定义与函数参数同名的变量

[英]Cannot use let to define a variable with the same name of function's parameter

久违了,我又回到了 javaScript,我刚刚了解了 ES6 的新特性。 这是第一个疑问。

虽然我知道let变量不能在同一个块范围内声明两次,但我遇到了这种情况:

    function tell(story){
       let story = {
          story
        };
     }

它给了我一个错误: Uncaught SyntaxError: Identifier 'story' has already been declared

使用var这工作得很好。

1)这是否意味着我必须使用let (甚至const )声明一个具有不同名称的函数参数的变量? 这在变量命名方面可能非常烦人。

为了保持相同的名称,我做了:

function tell(story){
     story = {
        story
     };
}

2) 在这种情况下,变量story将完全属于函数tell的范围?

使用var这工作得很好。

不是真的, var完全被忽略了,你实际上有:

function tell(story){
   story = {
      story
   };
 }

如果这是您想要的,只需完全关闭var (和let )(如上)。

let的错误解决了这个陷阱,您认为您已经创建了一个(新)变量但没有。 您不能使用let (或const )来声明已在同一范围内声明的变量(作为变量或作为参数,这与变量几乎相同)。

1)这是否意味着我必须使用let (甚至const )声明一个具有不同名称的函数参数的变量? 这在变量命名方面可能非常烦人。

这取决于你。 要继续做你正在做的事情,只需完全放弃varletconst ,因为再一次, var根本没有任何效果,你正在分配给参数,而不是新变量。 或者继续做你正在做的事情(使用var ),但要明白这是误导。 或者使用letconst使用不同的名称——许多人认为更改参数的值不是最佳实践(我个人不是其中之一,但是...),他们会推荐不同的变量.

2) 在这种情况下,变量story将完全属于函数tell的范围?

是的,您正在分配参数story ,这是 local to tell

“var 被完全忽略”

并非如此,请考虑以下两个示例:

1:

function someFn(a, b = () => a) {
  console.log(a, b());

  a = 2;
  
  console.log(a, b());
}
someFn(3);

2:

function someFn(a, b = () => a) {
  console.log(a, b());

  var a = 2;
  
  console.log(a, b());
}
someFn(3);

在第一个示例中,输出将是:
3 3
2 2
在第二个中:
3 3
2 3

所以var确实很重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM