簡體   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