1

このコードが正しく機能することもありますが、実行したい部分をどこに配置するかによって異なります。これは、実際にはまったく機能しないことを意味しますが、その理由がまったくわかりません。おそらく、皆さんの 1 人が何らかの洞察を提供できるかもしれません。

function displayBanner(currentDate) {
    var munf = currentDate.getMonth();

    var imageSrc = "defaultLogo.gif";   

    imageSrc = (munf == 9) ? ("fallLogo.gif") : ("defaultLogo.gif");
    imageSrc = (munf == 8) ? ("fallLogo.gif") : ("defaultLogo.gif");
    imageSrc = (munf == 10) ? ("fallLogo.gif") : ("defaultLogo.gif");

    imageSrc = (munf == 11) ? ("winterLogo.gif") : ("defaultLogo.gif");
    imageSrc = (munf == 0) ? ("winterLogo.gif") : ("defaultLogo.gif");
    imageSrc = (munf == 1) ? ("winterLogo.gif") : ("defaultLogo.gif");

    imageSrc = (munf == 2) ? ("springLogo.gif") : ("defaultLogo.gif");
    imageSrc = (munf == 3) ? ("springLogo.gif") : ("defaultLogo.gif");
    imageSrc = (munf == 4) ? ("springLogo.gif") : ("defaultLogo.gif");

    imageSrc = (munf == 7) ? ("summerLogo.gif") : ("defaultLogo.gif");
    imageSrc = (munf == 5) ? ("summerLogo.gif") : ("defaultLogo.gif");
    imageSrc = (munf == 6) ? ("summerLogo.gif") : ("defaultLogo.gif");

    return imageSrc;
}
4

5 に答える 5

1

論理的な問題があります。起こっていることは、正しい月が見つかったとしても、すべての比較が行われているということです。switch...case アプローチを試す必要があります。

switch(numf) {
    case 9:
    case 8:
    case 10:
        imageSrc = 'fallLogo.gif';
        break;
    case 11:
    case 0:
    case 1:
        imageSrc = 'winterLogo.gif';
        break;
    case 2:
    case 3:
    case 4:
        imageSrc = 'springLogo.gif';
        break;
    case 7:
    case 5:
    case 6:
        imageSrc = 'summerLogo.gif';
        break;
    default:
        imageSrc = 'defaultLogo.gif';
}
于 2013-07-30T15:20:09.747 に答える
0

imageSrc は、7 月 (最終行) を除くすべての月で defaultLogo.gif になります。

switch ステートメントを使用する方がはるかに優れています。

switch(munf) {
    case 9:
    case 8:
    case 10:
        return "fallLogo.gif";
    case 11:
    case 0:
    case 1:
        return "winterLogo.gif";
    ...
    default:
        return "defaultLogo.gif";
}
于 2013-07-30T15:18:30.960 に答える
0
function displayBanner(currentDate) {

    var munf = currentDate.getMonth();

    var imageSrc = "defaultLogo.gif";

    if ( munf > 7 && munf < 11 ) {
         imageSrc = 'fallLogo.gif';
    } else if ( munf > 10 || munf < 2 ) {
         imageSrc = 'winterLogo.gif';
    } else if ( munf > 1 && munf < 5 ) {
         imageSrc = 'springLogo.gif';
    } else if ( munf > 4 && munf < 8 ) {
        imageSrc = 'summerLogo.gif';
    }

    return imageSrc;
}
于 2013-07-30T15:16:29.203 に答える
0

すべての割り当てが発生するため、下されたすべての決定は次の決定によって覆されます。

たとえば、それmunfが 9だとしましょう。

imageSrc = (munf == 9) ? ("fallLogo.gif") : ("defaultLogo.gif");

期待どおりに設定imageSrc"fallLogo.gif"ます。しかしその後

imageSrc = (munf == 8) ? ("fallLogo.gif") : ("defaultLogo.gif");

も走り、munfは 8 ではないので、 に設定imageSrcし直し"defaultLogo.gif"ます。これは、次の各割り当てでも発生するため、最後の割り当てのみが顕著な影響を及ぼします。

次に行う必要があるのはimageSrc、デフォルトに戻らないようにすることです。元のコードに最も近いのは次のとおりです。

function displayBanner(currentDate) {
    var munf = currentDate.getMonth();

    var imageSrc = "defaultLogo.gif";   

    if (munf == 9) {
        imageSrc = "fallLogo.gif";
    }
    if (munf == 8) {
        imageSrc = "fallLogo.gif";
    }
    ...
    return imageSrc;
}

他の回答は、これを行うためのより簡潔な方法を示していelse ifますswitch。みんな、ありがとう!

もう 1 つ: 次のように、関数に対して一度に多数のテストを実行できます。

function runTests() {
    var date;

    date = new Date(2013, 0, 1);
    console.assert(displayBanner(date) == 'winterLogo.gif');

    date = new Date(2013, 1, 1);
    console.assert(displayBanner(date) == 'winterLogo.gif');

    date = new Date(2013, 2, 1);
    console.assert(displayBanner(date) == 'springLogo.gif');
    ...
}

これは単体テストと呼ばれ、コードからバグを追い出し、それらを締め出すのに非常に役立ちます。

于 2013-07-30T16:20:57.177 に答える