もう悩まない!ESLint"vars-on-top"ルールでコードの可読性と保守性を高める


JavaScript では、変数宣言はスコープ内の先頭に自動的に**"引き上げ"** (hoisting) されるという特徴があります。これは、変数が常にスコープの先頭で宣言されているかのように動作するためです。

しかし、"vars-on-top" ルールは、この自動的な引き上げ動作に明示的に従うことを求めます。つまり、変数宣言を常にスコープの先頭に記述することで、コードの意図を明確にし、可読性と保守性を向上させることを目的としています。

ルールの利点

"vars-on-top" ルールを適用することで、以下の利点が得られます。

  • 保守性の向上: 変数宣言が常にスコープの先頭にまとまっているため、コードを修正したり、新しい変数を追加したりする際に、変数のスコープ範囲を把握しやすくなります。
  • バグの防止: 変数宣言がスコープ内に散在していると、意図せぬ変数の再宣言や初期化漏れなどのバグが発生しやすくなります。"vars-on-top" ルールを適用することで、これらのバグを防ぐことができます。
  • コードの読みやすさの向上: 変数宣言が常にスコープの先頭にまとまっているため、コードの流れを把握しやすくなります。

ルールの設定

"vars-on-top" ルールは、ESLint の設定ファイル (.eslintrc) で有効にすることができます。

{
  "rules": {
    "vars-on-top": "error"
  }
}

この設定により、変数宣言がスコープの先頭にない場合、ESLint がエラーを出力します。

ルールの例外

"vars-on-top" ルールには、以下の例外があります。

  • 関数宣言: 関数宣言は、変数宣言とは異なり、スコープの先頭に配置する必要があります。そのため、"vars-on-top" ルールの対象ではありません。
  • let および const 宣言: let および const 宣言は、ブロックスコープにのみ適用されるため、"vars-on-top" ルールの対象ではありません。

"vars-on-top" ルールは、JavaScript コードの可読性、保守性、そしてバグ防止に役立つルールです。ESLint を使用している場合は、このルールを有効にして、コードの品質向上を図ることをおすすめします。

以下のコードは、"vars-on-top" ルールに違反しています。

function myFunction() {
  // 変数宣言がスコープ内に散在している
  var message;
  if (condition) {
    message = "Hello";
  } else {
    message = "Goodbye";
  }
  console.log(message);
}
function myFunction() {
  // 変数宣言をスコープの先頭にまとめた
  var message;
  if (condition) {
    message = "Hello";
  } else {
    message = "Goodbye";
  }
  console.log(message);
}


function myFunction() {
  doSomething();
  var message;
  if (condition) {
    message = "Hello";
  } else {
    message = "Goodbye";
  }
  console.log(message);
}

修正後コード

function myFunction() {
  var message; // 変数宣言をスコープの先頭に移動
  doSomething();
  if (condition) {
    message = "Hello";
  } else {
    message = "Goodbye";
  }
  console.log(message);
}

解説

上記のコードでは、message 変数がスコープ内に散在しています。 "vars-on-top" ルールに違反しているため、ESLint からエラーが出力されます。

修正後コードでは、message 変数の宣言をスコープの先頭に移動しました。 これで、"vars-on-top" ルールに準拠したコードになります。

function myFunction() {
  for (var i = 0; i < 10; i++) {
    console.log(i);
  }
  var message = "ループが完了しました";
  console.log(message);
}

このコードを修正するには、message 変数の宣言をループの外に移動する必要があります。

function myFunction() {
  for (var i = 0; i < 10; i++) {
    console.log(i);
  }
  console.log(message); // 変数宣言をループの外に移動
  var message = "ループが完了しました";
}


変数宣言のグループ化

function myFunction() {
  // 関連する変数をまとめて宣言
  var firstName = "John";
  var lastName = "Doe";
  console.log(firstName + " " + lastName);
}

関数スコープの活用

let および const 宣言は、ブロックスコープにのみ適用されるため、"vars-on-top" ルールの対象ではありません。 関数スコープを活用することで、変数のスコープ範囲を明確にし、コードの読みやすさを向上させることができます。

function myFunction() {
  if (condition) {
    // 関数スコープ内で変数を宣言
    let message = "Hello";
    console.log(message);
  } else {
    let message = "Goodbye";
    console.log(message);
  }
}

ルールの無効化

"vars-on-top" ルールが必ずしも適切ではない場合は、ルールを無効化することができます。 ただし、無効化する場合には、コードの読みやすさや保守性に悪影響を与えないように注意する必要があります。

{
  "rules": {
    "vars-on-top": "off"
  }
}

コメントの活用

変数のスコープ範囲を明確にするために、コメントを活用することができます。

function myFunction() {
  // コメントで変数のスコープ範囲を明確にする
  // --- メッセージ変数はこの if ブロック内でのみ有効 ---
  if (condition) {
    var message = "Hello";
    console.log(message);
  }
}

ツールの活用

"vars-on-top" ルールに準拠したコードを自動的に生成するツールもあります。 これらのツールを活用することで、開発の効率を向上させることができます。