Когда функция вызывается в javascript, первое, что происходит, - это то, что интерпретатор устанавливает цепочку области видимости в состояние, в котором она была при определении функции. В вашем случае цепочка областей выглядит так:
GLOBAL
|
CAll addTableEvents
|
CALL onclick
Поэтому, когда переменная orderID наткнулась на интерпретатор javascript, она ищет в цепочке областей действия эту переменную. В вашей функции onclick не определено orderID , поэтому следующая точка поиска находится внутри addTableEvents . Вы могли бы подумать, что orderID определен здесь, но поскольку вы не объявили orderID с ключевым словом var, orderID стал глобальной переменной, поэтому orderID не найден внутри addTableEvents . Последнее место, которое нужно посмотреть, находится внутри GLOBAL, и, разумеется, оно там, и его значение является последним, которому оно было назначено, и в этом случае его последнее значение orderID = row.getAttributeNode ("id") .value; в цикле for.
Чтобы увидеть это более четко, посмотрите на следующее
shanesObj.addTableEvents = function(){
table = document.getElementById("trackerTable");
for(i=1; i<table.getElementsByTagName("tr").length; i++){
row = table.getElementsByTagName("tr")[i];
orderID = row.getAttributeNode("id").value;
alert("before onclick: " + orderID);
row.onclick=function(){var orderID = orderID; shanesObj.tableRowEvent(orderID);};
}
orderID = -1;
}
shanesObj.tableRowEvent = function(orderID){
alert(orderID);
}
Результат клика здесь всегда будет -1.
Итак, чтобы обойти эту проблему, я предлагаю вам удалить весь лишний и ненужный код и использовать что-то вроде следующего,
for(i=1; i<table.getElementsByTagName("tr").length; i++){
row = table.getElementsByTagName("tr")[i];
row.onclick=function(){shanesObj.tableRowEvent(this.id);};
}
Просто получите доступ к атрибуту id непосредственно из вызываемого объекта.
P.S. Я понятия не имею, почему ваш код не работает в IE (он работал в моем IE7).