2015-11-03 14 views
0

Почему это не работает, как ожидалось:Javascript variabes сферы в встроенных функций

$(function(){ 
 
    var datas=[[1],[3]]; 
 
    var functions=[]; 
 
    for(var i in datas){ 
 
    \t var data=datas[i]; 
 
    functions.push(function(){ 
 
    \t $("div").append($("<p/>").text("data[0]="+data[0]+", datas["+i+"][0]="+datas[i][0])); 
 
    }); 
 
    } 
 
    for(var i in functions) 
 
    \t functions[i](); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div />

Я ожидаю:

data[0]=1, datas[0][0]=1 

data[0]=3, datas[1][0]=3 

Может кто-нибудь помочь мне понять, что происходит Вот?

Спасибо большое, привет Патрик

--------- ------- Решение

var data прошло в рамках функции, но это будет все еще изменение последующий.

Therefor лучших решений bind():

$(function(){ 
 
    var datas=[[1],[3]]; 
 
    var functions=[]; 
 
    for(var i in datas){ 
 
    \t var data=datas[i]; 
 
    functions.push(function(data){ 
 
    \t $("div").append($("<p/>").text("data[0]="+data[0]+", datas["+i+"][0]="+datas[i][0])); 
 
    }.bind(null,data)); 
 
    } 
 
    for(var i in functions) 
 
    \t functions[i](); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<div>

+0

В чем проблема? –

+0

Я ожидаю, что данные [0] = 1, datas [0] [0] = 1 и я получаю данные [0] = 3, datas [0] [0] = 1 почему? – pknoe3lh

+1

Возможный дубликат [JavaScript закрытия внутри петель - простой практический пример] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – Hacketo

ответ

2

Это все о видимости. Попытка изменить

var data=datas[i]; 
functions.push(function(){ 
    $("div").append($("<p/>").text("data[0]="+data[0]+", datas["+i+"][0]="+datas[i][0])); 
}); 

к

(function (data) { 
    functions.push(function(){ 
     $("div").append($("<p/>").text("data[0]="+data[0]+", datas["+i+"][0]="+datas[i][0])); 
    }); 
})(datas[i]); 

В для цикла области видимости значения data изменилось. Поэтому, когда вызывается functions, они используют последнее измененное значение data. Вот почему мы создали новую область, где data и function живут вместе в дружеской манере.

+1

Я бы предпочел решение с .bind(), упомянутым в двойном флаге, как-то более чистым, хотя выше сказанное должно работать, в любом случае вопрос заключается в том, чтобы быть закрытым как дубликат – mikus