0

$.get()関数を使用して多くのファイルを処理していますが、そのコールバック関数内から呼び出しているファイル名を見つける必要があります。これを行う方法はありますか?

while (allFilesToImport.length > 0) {
    var fileToOperate = allFilesToImport.shift();
    var jqxhr = $.get(path + '/' + fileToOperate,
        function(data, textStatus, jqXHR){ // here I need the fileToOperate variable!});
4

3 に答える 3

2

fileToOperate関数にアクセスして内部にアクセスできますmypathToTheFile。これが、クロージャが優れている理由の 1 つです。

それがあなたが持っている場合のループの例を次に示します。

var filenames = ['a', 'b', 'c'];
for(var i = 0; i < filenames.length; i++) {
    (function(filename) {
        $.get('whatever/'+filename, function(data) {
            // here you can use filename and it will point to the correct value
        });
    })(filenames[i]);
}

$.each()配列を反復処理するために使用することもできます。

$.each(filenames, function(i, filename) {
    $.get('whatever/'+filename, function(data) {
        // here you can use filename and it will point to the correct value
    });
});
于 2012-04-30T11:23:11.887 に答える
1

コールバック関数内でこの変数を使用するだけです。外側のスコープから変数の値を取得します。

var mypathToTheFile = path + '/' + fileToOperate;
var jqxhr = $.get(mypathToTheFile, function(data, textStatus){ 
// here I need the mypathToTheFile variable!
     do_something(mypathToTheFile);
});
于 2012-04-30T11:24:14.823 に答える
1

それには簡単な解決策があります。つまり、コールバックとして $.get に渡す関数値内の関数スコープ外から変数を使用できます (および関数値を渡す他のすべての場所)。

var mypathToTheFile = path + '/' + fileToOperate;
var jqxhr = $.get(mypathToTheFile, 
                  function(data, textStatus){ 
                      // here you simply use the mypathToTheFile variable!
                 });

クロージャを使用する際に注意すべき点がいくつかあります。関数スコープ外の変数への変更は、関数内に反映されます。例えば

var functionValues = [],i,j;
for(i=0;i<10;i+=1){
    j = new String(i);
    functionValues[i] = function(){alert(j);};
}

for(i=0;i<10;i+=1){
    functionValues[i](); //this will alert 9 every time
}

0,1,2,3,4,5,6,7,8,9 は 9 10 回アラートを発します

于 2012-04-30T11:23:47.827 に答える