javascriptのスコープについて

javascriptのスコープについてです。

曖昧な知識のままだったので、まとめます。

ブロックスコープ

ブロックでのスコープという概念がありません。

{
  var i = 5;
}
console.log(i);
=>5

このように平気でアクセスできてしまいます。

rubyだとブロックの中の変数は外からは参照することができません。

Proc.new do
  x = 1
end
p x
=>NameError: undefined local variable or method `x' for main:Object

関数のスコープで制限する

そこで編み出された手法が、関数の中はスコープが存在するので、関数の中に閉じ込めるという手法です。

(function(){
  var i = 5;
  console.log(i);
}).call(this);

console.log(i)
=>Uncaught ReferenceError: i is not defined

先人の人たちはよくこんなことを思いついたものだ。

さすがにこの技ばかりでは可読性がないので、ES2015からは状況が変わりました。

let constでスコープを定める

{
  let i = 5;
  console.log(i);
}
console.log(i)
=>Uncaught ReferenceError: i is not defined

このようにスコープできるようになりました。

以上です。