1

文字列の配列をループして3秒の遅延後にそれぞれを表示することで、JavaScriptでタイミング関数をテストしようとしていますが、関数を呼び出すと、最初の文字列の最初の文字だけを取得するという奇妙なパターンが実行されます。 2番目の文字列の2番目の文字など...配列の4番目の項目に4番目の文字がない場合、未定義で出力されます。助けてください。ありがとう

function myFunc () {
    setTimeout(function () {
        var contacts = {
            addressBook : [
            {
                'name' : 'Jane',
                'email' : 'JaneDoegmail.com'
            },
            {
                'name' : 'Meggie',
                'email' : 'meggiegmail.com'
            },
            {
                'name' : 'John',
                'email' : 'johnDoegmail.com'
            },
            {
                'name' : 'Paul',
                'email' : 'paulgmail.com'
            },
            {
                'name' : 'Bo',
                'email' : 'bogmail.com'
            }
            ]
        };
        var object = contacts.addressBook;
        var i;
        for (var i = 0; i < object.length; i++) {
            var item = object[i];
            var name = item.name;
            var email = item.email;

            document.write(name[i]);
        };

        if (i < 10) {
            myFunc();
        };
    }, 3000)
}
myFunc();
4

4 に答える 4

2

これが動作するjsFiddleデモです

基本的に、出力は指示した内容から正しく、名前文字列のインデックスにある文字が表示されます。(name)の代わりに使用する必要があり(name[i])ます。

しかし、私はこれがおそらくあなたが求めていたものだと思います:提案された改善デモ

基本的に、ループは、呼び出されたときにインクリメントし、すべての連絡先アドレスが表示されると停止するカウンターによって外部から制御できるようにします。

js:

var c = document.getElementById("console");
var contacts = {
  addressBook : [
    {
        'name' : 'Jane',
        'email' : 'JaneDoegmail.com'
    },
    {
        'name' : 'Meggie',
        'email' : 'meggiegmail.com'
    },
    {
        'name' : 'John',
        'email' : 'johnDoegmail.com'
    },
    {
        'name' : 'Paul',
        'email' : 'paulgmail.com'
    },
    {
        'name' : 'Bo',
        'email' : 'bogmail.com'
    }
  ]
};
var i = 0;
(function myFunc () {
 var item = contacts.addressBook[i++];
 var name = item.name;
 var email = item.email;
 c.innerHTML += name +", " + email + "<br>";
 if (i < contacts.addressBook.length) {
  setTimeout(myFunc,3000);
 }
})()
于 2013-03-22T18:51:18.383 に答える
1

の代わりにdocument.write(name[i]);document.write(name);

于 2013-03-22T18:43:24.133 に答える
0

あなたのdocument.write(name[i]);

する必要があります

document.write(name);

ありがとう

于 2013-03-22T18:45:04.733 に答える
0

見てみな:

myFunc();
function myFunc () {
setTimeout(function () {
    var contacts = {
    addressBook : [
        {
            'name' : 'Jane',
            'email' : 'JaneDoegmail.com'
        },
        {
            'name' : 'Meggie',
            'email' : 'meggiegmail.com'
        },
        {
            'name' : 'John',
            'email' : 'johnDoegmail.com'
        },
        {
            'name' : 'Paul',
            'email' : 'paulgmail.com'
        },
        {
            'name' : 'Bo',
            'email' : 'bogmail.com'
        }
    ]
};
var object = contacts.addressBook;
var i;
for (var i = 0; i < object.length; i++) {
    var item = object[i];
    var name = item.name;
    var email = item.email;

    document.write(name+" -->  ");
};

if (i < 10) {
    myFunc();
};
}, 3000)}
于 2013-03-22T18:49:10.617 に答える