Функция и цикл

Здорова ребятки. Возникла проблемка. Несоответсвие значений в цикле
        for(var t=0;t<th.length;t++){
                th[t].onclick = function(){ sort(t); };
                console.log(t);
            };
со значениями n в функции sort()
window.onload = function(){
 
    function sortable(table) {
        var thead = table.tHead;
        var tbody = table.tBodies[0];
        var th = thead.getElementsByTagName('td');
        var rows = tbody.getElementsByTagName('tr');
        th = Array.prototype.slice.call(th,0);
        rows = Array.prototype.slice.call(rows,0);
 
        for(var t=0;t<th.length;t++){
                th[t].onclick = function(){ sort(t); };
                console.log(t);
            };
 
        function sort(n){
            rows.sort(function(row1,row2){
                console.log(n);
                var cell1 = row1.getElementsByTagName('td')[n];
                var cell2 = row2.getElementsByTagName('td')[n];
                var val1 = cell1.textContent || cell1.innerText;
                var val2 = cell2.textContent || cell2.innerText;
                    if(val1>val2) return 1;
                    else if(val1<val2) return -1;
                    else return 0;
            });
 
        for(var i=0;i<rows.length;i++) tbody.appendChild(rows[i]);
 
        };
    };
 
    sortable(document.getElementById('table'));
 
};
t выдает 0,1 но в функцию sort() передается значение 2 о_О в чем причина? то что затирает знаюhttp://jsbin.com/UXeCAVI/1/editконечно, гениальность решения состоит в простом
            for(var t=0;t<th.length;t++){
                (function(n){
                    th[t].onclick = function(){ sort(n); };
                }(t));
            };
но объясните результатвиртуально мы создаем две функции, которые мгновенно обрабатываются независимо друг от друга, и передают прямое значение 0 и 1 в функцию sort вместо переменной t которая в свою очередь затирается, да?
14 ответов

Значения t в данном случае хранятся в замыкании, и теперь когда инициируется событие клика, функция sort берет значение из этого замыкания. Без функции вызова на месте (ваш первый ошибочный вариант), функция sort брала последнее значения из вашего цикла for. Сейчас же благодаря образовавшемуся замыканию, sort берет значение на каждой итерации.


спасибоа почему тогда такой же результат не дает
 for(var t=0;t<th.length;t++){
                    th[t].onclick = function(){ var n = t; sort(n); };
                };
            };
по сути, то же замыканиеи где хранится значение t в правильном варианте? если это замыкание, в arguments[0]?


а вот тут у вас нет никакого замыкания потому как функция onclick выполнится только после того как весь цикл пройдет (то есть в момент клика мышкой) а переменная t в кострукции th[t] будет взята последней из цикла for.Прошу прощения не в констукции th[t] а в костркции function(){ var n = t; sort(n); } ..


аа спасибо большоено еще один вопрос не раскрыти где хранится значение t в правильном варианте? если это замыкание, в arguments[0]?


Да, все верно Вот вам пример:
<p class="th">test</p>
 <p class="th">test</p>
 <p class="th">test</p>
 <p class="th">test</p>
 <p class="th">test</p>
 <p class="th">test</p>
 <p class="th">test</p>
 <p class="th">test</p>
 <p class="th">test</p>
 <p class="th">test</p>
var th = document.querySelectorAll('.th');
 
      for(var t=0;t<th.length;t++){
              (function(t){
                  var arg_i = arguments[0];
                   th[t].onclick = function(){ alert(arg_i) };
                })(t);
                   
              }
Вообще советую вам разобраться с замыканиями, потому как без них разрабатывать на js невозможно


да я то знаю, чего то просто думал просто думал что так нельзяпросто надо было типа так сделать
 for(var t=0;t<th.length;t++){
                    th[t].onclick = function(){ var n = eval(t); sort(n); };
                };
            };


сейчас у вас антипатерн получился


var arr = [];
for(var i = 0; i < 10; i++){
  with({i: i}) arr[i] = function(){
    console.log(i);
  };
}
arr.forEach(function(e){e()});
советую вам разобраться с замыканиями, потому как без них разрабатывать на js невозможно
можно не использовать замыкания
и где хранится значение t в правильном варианте? если это замыкание, в arguments[0]?
в scope, http://javascript.ru/basic/closure в хроме можно поизучать результат
console.dir(function(){})


with уже давно в deprecated. А без замыкний можно, если плодить 101 глобальную переменную


А без замыкний можно, если плодить 101 глобальную переменную
можно и не плодить, и при этом не использовать замыкания.
with уже давно в deprecated.
кто сказал? где написано? http://www.ecma-international.org/ecma-262/5.1/#sec-12.10 http://javascript.ru/ecma/part12#a-12.10


можно и не плодить, и при этом не использовать замыкания.
в своей практике я ни разу такого не видел и совершенно очевидно что это не правда
кто сказал? где написано?
https://developer.mozilla.org/en-US/...tatements/with


vovandr, мозилы сами по себе, не они утверждают стандарты. в первоисточниках нет пометок deprecated рядом с with statement. использовать with не рекомендуется школьникам, потому что они не умеют отлавливать ошибки. замыкания им тоже не рекомендуется юзать. им вообще нужно сначала руки выпрямить.
в своей практике я ни разу такого не видел и совершенно очевидно что это не правда
есть кроме js и другие языки программирования, где замыканий нет. да, это правда, нет замыканий. и все равно каким то чудом программы на этих языках пишутся, и иногда даже работают. вот ведь волшебники.например в as3-сообществе линчуют программиста если увидели что он использует замыкания. вот так вот, замыкания есть, а использовать нельзя. правда там и на with тоже огрызаются, хотя там то уж точно нигде не написано что with deprecated.


nubideus, в данном контексте речь идет о javascript. В этом языке три стлопа: объекты - функции - замыкания. Замыкания в js всегда есть в явном или неявном виде.


в замыканиях все же есть свое преимущество