非推奨の機能

JavaScriptのイディオム(慣用的な書き方)や文法のなかには、 ECMAScriptのアップデートによって不要になったり非推奨になったりした古い書き方がいくつもあります。 そのような書き方はこれから書かれるJavaScriptの中で使わないようにすべきですが、 既存の古いコードのなかで使われていたときに読めなければ困るでしょう。 この章では、そのような一般的に非推奨とされるJavaScriptの書き方を紹介します。

即時実行関数

  • 代替方法: let/constによる変数宣言

即時実行関数(IIEF, Immediately-Invoked Function Expression)は、 グローバルスコープの汚染を避けるために生まれたイディオムです。 次のように、匿名関数を宣言した直後に呼び出すことで、任意の処理を関数のスコープに閉じて実行できます。

(function() {
    // 関数のスコープ内でfoo変数を宣言している
    var foo = "foo";
    console.log(foo); // => "foo"
})();
// foo変数のスコープ外
console.log(typeof foo === "undefined"); // => true

ECMAScript 5までは、変数を宣言する方法はvarしか存在しません。 このイディオムはvarによるグローバルスコープの汚染を防ぐために必要でした。 しかしECMAScript 2015で導入されたletconstにより、ブロックスコープに対して変数宣言できるようになりました。 そのため、グローバルスコープの汚染を防ぐための即時実行関数は不要です。 先ほどの即時実行関数は次のように書き換えられます。

{
    // ブロックスコープ内でfoo変数を宣言している
    const foo = "foo";
    console.log(foo); // => "foo"
}
// foo変数のスコープ外
console.log(typeof foo === "undefined"); // => true

argumentsによる可変長引数

  • 代替方法: Rest parameters

arguments変数はその関数に渡された引数が格納される特殊な変数です。 たとえば引数として渡した数値を足し合わせるsum関数は、arguments変数を使って次のように書けます。

function sum() {  
    // argumentsはarray-likeなオブジェクトなのでreduceメソッドを持たない
    return Array.prototype.reduce.call(arguments, function(sum, el) {
        return sum + el;
    });
}
sum(10, 5, 2); // => 17

arguments変数は配列のようにインデックスで要素にアクセスできますが、Arrayオブジェクトのインスタンスではありません。 そのため、mapreduceといったArrayオブジェクトのメソッドを直接呼び出すことはできません。

ECMAScript 2015で導入されたRest parametersは、可変長引数を文法としてサポートします。 Rest parametersが使える環境であれば、arguments変数は不要です。 さきほどのsum関数は次のように書き直すことができます。 可変長引数を配列として扱えるため、Rest parametersを使った書き方が推奨されます。

function sum(...numbers) {  
    return numbers.reduce((sum, el) => sum + el);
}
sum(10, 5, 2); // => 17

results matching ""

    No results matching ""