2012年05月21日
川俣晶の縁側ソフトウェア技術雑記 total 4898 count

C#とJavaScriptのスコープはどう違うか

Written By: 川俣 晶連絡先

 forとかvarとか使っているとC#とJavaScriptのソースがそっくりに見えるけれど、落とし穴もあるってことですね。

C#: §

using System;

using System.Collections.Generic;

class Program

{

    static void Main(string[] args)

    {

        var l = new List<Func<int>>();

        for (int i = 0; i < 2; i++)

        {

            int i0 = i;

            l.Add(() => i0);

        }

        foreach (var item in l) Console.WriteLine(item()); 

    }

}

実行結果:

0

1

JavaScriptその1: §

<!DOCTYPE html>

<html>

<head>

    <title></title>

    <script>

        var l = new Array();

        for (var i = 0; i < 2; i++) {

            var i0 = i;

            l.push(function(){return i0;});

        }

        for (var i = 0; i < 2; i++) alert(l[i]());

    </script>

</head>

<body>

</body>

</html>

実行結果:

1

1

 というわけで、結果が違いますね。

 JavaScriptで結果を同じにするために、こんな感じに書き換えてみました。

JavaScriptその2: (最初のforループだけ差し替え) §

        for (var i = 0; i < 2; i++) {

            (function () {

                var i0 = i;

                l.push(function () { return i0; });

            } ());

        }

実行結果:

0

1

感想 §

 他人のソースで(function () {……} ());なんていうコードを見たことがあって、なんだろうねーと思っていたら自分でも書いてしまった……。どんどんJavaScriptの深みにはまっていく自分が怖い。(Visual C#のMVPなのに!)