> {cell.onclick= function() {checkCell(i, j)};};
> SetCellClick(i, j);
С первой строкой, думаю, проблем не будет, а вот дальше придётся применить один интересный приём под названием замыкание. Этот метод нашёл широкое применение в JavaScript, не знаю используется–ли он в других языках, не сталкивался, а тут без него ряд задач сделать крайне сложно.
Так вот, зачем же мы пишем так:
> function SetCellClick(i, j)
> {cell.onclick= function() {checkCell(i, j)};};
> SetCellClick(i, j);
и почему нельзя написать просто так:
cell.onclick= function() {checkCell(i, j)};
Чтобы ответить на этот вопрос, давайте попробуем поставить себя на место интерпретатора. Как ему определить, что вам в качестве параметра функции checkCell нужны именно конкретные значения переменных i и j в данный момент, а не значения этих переменных в момент вызова функции. Не буду сейчас загромождать вам мозг понятием ссылок и указателей, с помощью которых зачастую подобные проблемы решаются в других языках, в JavaScript, насколько мне известно таких понятий нет.
Так вот, чтобы в качестве параметров функции checkCell в будущем брались те значения переменных i и j, которые они имеют в момент присваивания, делается такой хитрый приём: создается местная функция внутри которой и происходит присваивание. Фокус в том, что в этом случае используются не долгоживущие переменные, объявленные в функции initTable, а короткоживущие параметры функции SetCellClick.
Всем пока.