シャドーイングとCoffeeScript

coffescript

シャドーイングとCoffeeScriptの仕様についてメモです。

シャドーイングとは同じ名前で新しい別の変数を定義する事で、スコープの中で変数名をどかどか使い捨てていく場合に便利です。

var str = 'global';
function local() {
  var str = 'local';
  console.log(str);
}
local();           // 'local'
console.log(str);  // 'global'

CoffeeScriptで上記と同じコードを吐きそうなコードを書いてみるとどうなるでしょう?

//CoffeeScript
str = 'global'
local = () ->
  str = 'local'
  console.log(str)

local()           // 'local'
console.log(str)  // 'local'  ←!?

吐出されたjsを見てみると、なんと!
外側の変数と同じ名前を付けようとした変数にvarが付かず外側の変数を上書きしてしまいます!
CoffeeScriptではシャドーイングが禁止されている仕様だそうです。

(function() {
  var local, str;

  str = 'global';

  local = function() {
    str = 'local';  // varが付かない!
    return console.log(str);
  };

  local();

  console.log(str);

}).call(this);

CoffeeScriptのシャドーイングは、ハマるポイントなので気をつけましょう。

Author