1

画像パスを含む変数があります。JSON オブジェクトに対して受け取る整数値に応じて、この変数は異なるパスを取得するはずです。

ただし、以下の関数内の何らかの理由で、JSON オブジェクトが switch ステートメントに対して正しい整数を返すという事実を知っているにもかかわらず、変数に割り当てられたパスはグローバルに宣言されたパスのままです。以下のコードを見てください。

function spawnThumbnails() {
    $.getJSON('scripts/get_thumbs.php', function(data){

        $.each(data, function(thumb, thumbInfo){
            var thumbimage; 
               // If I create local thumbimage var like so, 
               //the image below turns is undefined
               // But if local thumbimage var is not declared,
               // the value defaults to globally declared value of arctic.svg

            var thumbtype = thumbInfo.type;

            alert(thumbtype); // this will alert correct type (an integer)

            switch(thumbtype){
                case 1: thumbimage = 'graphics/thumbs/arctic.svg'; break;
                case 2: thumbimage = 'graphics/thumbs/savan.svg'; break;
                case 3: thumbimage = 'graphics/thumbs/trop.svg'; break;
                case 4: thumbimage = 'graphics/thumbs/tundra.svg'; break;
                case 5: thumbimage = 'graphics/thumbs/ocea.svg'; break;
            }


                $("#thumbtest").append('<img src="' + thumbimage + '">'); 
                // returning as the default image or undefined 

        }); //end each
    }); // end json 
}

var thumbimage = 'graphics/thumbs/artic.svg'; // default image

// I have tried placing the function definition here as well, 
// but there is no difference. Should there be?

spawnThumbnails();

私はJavaScript関数スコープなどに慣れていません。関数呼び出しとグローバル変数宣言の前に関数を宣言できるはずだと思うのは正しいですか?

また、spawnThumbnails 関数の宣言で "thumbimage" パラメーターを宣言する必要がないことも奇妙に感じます。実際、パラメーターを宣言すると、壊れます。しかし、これは新しいローカル変数を作成するためだと思いますよね?

助けてくれてありがとう!あらかじめ

4

1 に答える 1

2

スイッチは同一の比較を行っています ( ===)。変数thumbtypeは文字列ですが、数値があっても文字列のままです。

タイプが異なるため、スイッチは'1' === 1false に評価されます。

整数ではなく文字列と比較します(引用符に注意してください)

        switch(thumbtype){
            case '1': thumbimage = 'graphics/thumbs/arctic.svg'; break;
            case '2': thumbimage = 'graphics/thumbs/savan.svg'; break;
            case '3': thumbimage = 'graphics/thumbs/trop.svg'; break;
            case '4': thumbimage = 'graphics/thumbs/tundra.svg'; break;
            case '5': thumbimage = 'graphics/thumbs/ocea.svg'; break;
        }

または、文字列を整数に変換し、スイッチをそのままにして数値として比較します。

thumbtype = parseInt(thumbtype);

ECMA 262 言語仕様、セクション 12.11 から:

=== 演算子で定義されているように、input が clauseSelector と等しい場合、

于 2013-06-20T07:20:58.147 に答える