94615


書籍「ハンズオンJavaScript（オイラリー）」に以下のような記述がありました。  
では、なぜ最初からlet,constを使わないのか？  
変数を宣言するのにlet,constは必須なのでは？

> § 2.13.3 プロパティの値をまとめて取得する
>
> （ _…分割代入を使ってオブジェクトの要素をまとめて取得しようみたいなことが書いてある_ ）
>
> `({power, development} = parameters)`
>
> ～代入の文脈で{}を使用するとそのままではブロック要素とみなされてError  
>  （中略）  
>  ただし **letやconstを用いるとカッコは不要**

**4/24追記**

変数宣言からの再代入ではないか、とのご回答をいただいたため、少し調べてみました。

getter, setterを定義する、という項目です。

[code]

    class Vector2 {
    　// ...これまでのメソッドは省略...
     get length(){
      return Math.sqrt(this.lenthSq())
     }
     set length(len) {
      const ratio = len / this.length
      this.x *= ratio
      this.y *= ratio
     }
    }
    
    > vec = new Vector(3, 4);
    > vec.lenth
    > vec.lentgh = 40
    > vec
    
[/code]

原文ママです。  
今ここでインスタンス化しているので、再代入の線はない…はずです。


CC BY-SA 4.0
2023-04-21T16:28:28.187
94604
2023-04-30T06:32:37.423
2023-04-30T06:32:37.423
3060
53242
question
javascript
letやconstが無い宣言のようなJavaScriptコードが書籍に登場する


> 前掲書ではlet, constを使わずに変数宣言をすることが多々ある

おそらく、それは宣言では無くて代入（変数の値の変更）です。その箇所に到達する以前に変数が宣言されているはずです。

### 代入

変数への値の代入は、宣言と同時になされることが多いですが、（const でなければ）後から行うことも有ります。後から代入するにしても、宣言は必要です。

[code]

    // 宣言
    let power = 1
    let development = 1
                                                           
    if (useRandom) {
        // 代入
        ({power, development} = getRandomParameters())
    }
    
[/code]

このような後からの代入は「変数の値の変更」とも表現される操作で、変数が可変である言語では頻出します。

### 宣言されていない変数への代入

上で「宣言は必要」と述べましたが、古くは宣言無しで代入するコードも有りました。その場合、グローバル変数が作成されます。これを、「暗黙の宣言」と捉えることも可能です。しかし、この機能の使用は問題が多かったため、現在は推奨されず消滅したコーディングスタイルです。

[厳格モード](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Strict_mode)では使用が不可能になっています。

* * *

追記:

### Repl （対話環境）上のコード

書籍中に、

[code]

    > vec = new Vector(3, 4);
    
[/code]

というコードが有ったとのことですが、これは repl （対話環境）で入力する書き捨てのコードです。`>`
が行頭に付いていることがそれを示しています。Repl
のトップレベルは厳格モードではありませんので、これは上の「宣言されていない変数への代入」で説明した動作となります。

このように、repl
では通常のプログラミングでは使用しない構文や機能を用いることがあります。しかし、あくまで実験や調査のための書き捨てのコードを手間無く入力する、という目的から行なわれるのみであり、通常のコーディングスタイルとして推奨されることはありません。

ちなみに、repl によっては書き捨てのコードを支援する機能が有ります。例えば、質問中に登場する、エラーになるはずのコード `{power,
development} = parameters` は Node の repl
ではエラーにならず実行されます。その他にも、ブロック要素と見なされエラーになるはずの構文が使用できることがあります。`{ a: 123, b: 456 }`
のような単純なオブジェクト初期化子ですと、多くの処理系の repl でエラー無く実行できるでしょう。

このように、repl には利便性のための細工も存在するため、通常のコードとは区別して考える必要があります。


CC BY-SA 4.0
2023-04-22T21:59:34.337
94615
2023-04-29T20:13:44.333
2023-04-29T20:13:44.333
3054
3054
94604
answer