forループトラバーサルの場合のvarletの違い

たとえば、WeChatアプレットの出力0〜9をトラバースするには、forループを使用します。

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

    console.log(i);

}

出力:

ただし、ループ中にwx apiインターフェイスを同時に10回呼び出すと、出力結果が異なります(これは非公開の効果です)

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

    wx.showToast({

        title: 'haha',

        success: function () {

            console.log(i);

        }

    })

}

出力:

出力が10×10であることがわかります。これは、i引数のスコープが原因であり、ここではグローバル変数と同等です。

ストレージユニットは、割り当てられたすべての下位ストレージユニットに接続されていることが理解できます(自分の理解)

解決:

1.一時的な機能を使用する(すべてと互換性がある)

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

    (function (j) {

        wx.showToast({

            title: 'haha',

            success: function () {

                console.log(j);

            }

        })

    })(i);

}

に相当

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

    function temp(j) {

        wx.showToast({

            title: 'haha',

            success: function () {

                console.log(j);

            }

        })

    };

    temp(i);

}

出力:

2. ES6でletのブロックスコープを使用します(推奨)(IEの下位バージョンは互換性がありません)

for (let i = 0; i < 10; i++) {

    wx.showToast({

        title: 'haha',

        success: function () {

            console.log(i);

        }

    })

}

出力:

 

ただし、関数の外部でiを定義すると、ループのグローバル変数と同等になります。

let i;

for (i = 0; i < 10; i++) {

    wx.showToast({

        title: 'haha',

        success: function () {

            console.log(i);

        }

    })

}

結果はまだです:

おすすめ

転載: blog.csdn.net/wnagyubin/article/details/113119504