> これは二度目はvarを省略して、再宣言していると考えるのは間違えで、これは100%再代入と考えてよいという事でしょうか?
はい、var が無い場合は変数の宣言ではなく、代入演算子を使った処理です。
> letは再代入は化で、再宣言は不可という事なので再宣言のlet、const省略はないですが、varの場合はどうですか?
let はブロックスコープの「変数」なので、中の値はいつでも書き換え可能です。
再宣言は ECMAScript の規定でエラーにすることになっているので不可です。
const は「定数」なので、一度宣言して値をセットしたら変更不可能なので再宣言も再代入もできません。
var は「変数」なので、中の値はいつでも書き換え可能です。
再宣言については var は出来るのですが、言語エンジン内での処理としては var 宣言を無視するだけです。
これも ECMAScript の規定で定められており、var の処理としては「変数が存在しなければ変数を作る」と言う事になっているので、変数が存在したら新たに作ることはせず次の処理に進むだけです。
var と let の扱いの違いは歴史的なものもあって複雑な話なのですが、後から出てきた let の方が他のプログラム言語と同じ厳密な振る舞いになっていて、古くから存在する var は JavaScript 特有の緩い振る舞いをしています。
質問者
お礼
a = 2は再代入なので、
二度目からの再宣言はvarの省略ができるという情報は間違えなのですかね。
varがなければ必ず再代入で、
varがあれば必ず宣言。二度目なら再宣言という事ですね。
質問者
補足
varのみ再宣言ができるが、言語エンジン内での処理としては var 宣言を無視するという事ですが、
無視とはvarを無視して再代入として考えるという事ですか?
それとも再宣言自体がなかったことにするという事でしょうか?
ブロックスコープと関数スコープのさもなんだかよくわからないのですが、
教えていただければ幸いです。
> すると再宣言とは実は再代入の事を示す別の言い方になるのでしょうか?
そもそも再宣言は Syntax Error になり、その場で処理が中断します。
先の回答にも書いた通り let はブロックスコープなので、ブロックが異なれば別変数として扱われるので、あなたが再宣言だと思っているのは実は別ブロックで宣言が行われているものじゃないでしょうか。
質問者
お礼
var a = 1
a = 2
というソースをよく見るのですが、これは二度目はvarを省略して、
再宣言していると考えるのは間違えで、
これは100%再代入と考えてよいという事でしょうか?
letは再代入は化で、再宣言は不可という事なので再宣言のlet、const省略はないですが、varの場合はどうですか?
お礼
a = 2は再代入なので、 二度目からの再宣言はvarの省略ができるという情報は間違えなのですかね。 varがなければ必ず再代入で、 varがあれば必ず宣言。二度目なら再宣言という事ですね。
補足
varのみ再宣言ができるが、言語エンジン内での処理としては var 宣言を無視するという事ですが、 無視とはvarを無視して再代入として考えるという事ですか? それとも再宣言自体がなかったことにするという事でしょうか? ブロックスコープと関数スコープのさもなんだかよくわからないのですが、 教えていただければ幸いです。