簡體   English   中英

如何將變量傳遞給函數調用參數的一部分?

[英]How to pass a variable to a function that's part of the parameters of a function call?

for (var i = 0; i < json.length; i++) {
    $.Mustache.load('/mustaches.php', function(i) {
         //Do Something
    });
}

在這種情況下,如何將var i傳遞給函數?

編輯:對不起我實際上並不想讓Mustache.load調用太多次。 只有一次。 我怎樣才能做到這一點?

這比您想象的要復雜一些,因為您必須確保傳遞正確的i值,以便回調不使用循環結束的值。

for (var i = 0; i < json.length; i++) {
    (function(i){
        $.Mustache.load('/mustaches.php', function() {
            // use i. Call a function if necessary
            //Do Something
        });
    })(i);
}

關於回調術語:它指的是作為參數傳遞的函數,以便您調用的函數可以將其調用回來。

要理解我寫的代碼,你必須

  • 理解回調是在循環結束時調用的,所以當循環中的i具有循環結束的值時
  • 非全局變量的范圍是定義它的函數調用。 這就是為什么有這個中間函數:定義另一個用循環值調用的變量i

解決問題的一種優雅方法是使用bind方法。

for (var i = 0; i < json.length; i++) {
    $.Mustache.load('/mustaches.php', function(i) {
         //Do Something
    }.bind(this, i));
}

bind方法返回一個帶有新上下文的新函數(在本例中為this ),並將一個(或多個)參數應用於您的函數(在此特定情況下為i )。 你可以在這里找到更多關於bindcurrying 信息

編輯。 您只需加載模板一次即可優化循環。 實際上, $.Mustache.load在循環的每個循環中獲取/mustache.php 此外,由於函數使用AJAX異步獲取模板,因此模板中的排序可能不一致(一個響應可能需要比其他響應更長的時間)。 修復非常簡單:我們加載模板,然后迭代循環。

$.get('/mustache.php').done(function(template){
  $.Mustache.add('my-template', template);
  for (var i = 0, len = json.length; i < len; ++i) {
    var rendered_template = $.Mustache.render('my-template', {
      i: i,
      ...
    });
  }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM