2012年05月21日
川俣晶の縁側ソフトウェア技術雑記total 4897 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なのに!)

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
2012年
05月
22日
GPLは僕らの味方なのか? 「フリー」ソフトウェアファウンデーションは自由の味方なのか?
3days 0 count
total 4037 count
【技術雑記】の前のコンテンツ
2012年
05月
20日
なぜ今時Power PCのMacに熱烈な引き合いがあるのか
3days 0 count
total 3777 count

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20120521133403
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.