首頁 > web前端 > js教程 > 主體

如何在 JavaScript 閉環循環中存取外部變數?

Mary-Kate Olsen
發布: 2024-10-20 08:56:02
原創
332 人瀏覽過

How to Access an Outside Variable within a JavaScript Closure Loop?

從JavaScript 閉包中存取循環中的外部變數

在JavaScript 中,當使用for 循環迭代數組時,很常見循環內變數的值始終與上次迭代相同的問題。這是由於可變作用域和閉包造成的。

為了解決這個問題,可以採用一種稱為閉包的技術。閉包是一個傳回函數的函數,它捕捉父函數的變數範圍。

考慮以下範例:

<code class="javascript">for (var i in this.items) {
    var item = this.items[i];
    $("#showcasenav").append("<li id=\"showcasebutton_" + item.id + "\"><img src=\"/images/showcase/icon-" + item.id + ".png\" /></li>");
    $("#showcasebutton_" + item.id).click(function() {
        alert(item.id);
        self.switchto(item.id);
    });
}</code>
登入後複製

在這段程式碼中,變數項隨著每次變化而變化。循環的迭代。當呼叫點擊處理程序時,它使用 item 的最後一個值。

為了解決這個問題,我們可以使用閉包來捕獲循環變數的範圍:

<code class="javascript">for (var i in this.items) {
    var item = this.items[i];
    $("#showcasenav").append("<li id=\"showcasebutton_" + item.id + "\"><img src=\"/images/showcase/icon-" + item.id + ".png\" /></li>");
    $("#showcasebutton_" + item.id).click(
        // create an anonymous function that will scope "item"
        (function(item) {
            // that returns our function
            return function() {
                alert(item.id);
                self.switchto(item.id);
            };
        })(item) // immediately call it with "item"
    );
}</code>
登入後複製

這裡,我們將點擊處理函數包裝在另一個函數中,該函數在循環迭代期間捕捉item 的範圍。當呼叫點擊處理程序時,它會使用正確的 item 值。

另一種方法是使用 jQuery 的 $.each() 函數,該函數會自動取得循環變量,因此無需閉包:

<code class="javascript">$.each(this.items, function(i, item) {
    $("#showcasenav").append("<li id=\"showcasebutton_" + item.id + "\"><img src=\"/images/showcase/icon-" + item.id + ".png\" /></li>");
    $("#showcasebutton_" + item.id).click(function() {
        alert(item.id);
        self.switchto(item.id);
    });
});</code>
登入後複製

以上是如何在 JavaScript 閉環循環中存取外部變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!