root/window
|
|-yourcall()
\
|-var abc
|-io.on('connection', function) - здесь не происходит захвата области видимости. тут только передаётся сигнатура функции внутрь io.on. грубо говоря это похоже на присвоение: io.on.connection = function
| далее вы продолжаете свою функцию
|-other()
|-other()
| - в этот момент происходит событие connection, которое по определению не внутри видимости вашей функции. ваша функция приостанавливает работу
| window.trigger('connection') - типа такого происходит
| срабатывает триггер window.on('connection', io.on.connection);
\
\- io.on.connection.call(this,args); - вот тут происходит цепляние области видимости. а он отличается от вашего. стек областей видимости будет примерно такой: [window, io, io.on.trigger] — соответственно только что что есть внутри этих трёх функций будет доступно вашему колбеку. в джава скрипте только то, что вы явно указали из вашей текущей области внутри колбека и будет доступно.
в вашем же примере кроме вышеуказанной области видимости внутри ещё один определяется триггер: window.socket.on('connect') из которой ваша область видимости (где находится var abc) так же недоступна ни косвенно (как io.on.connection, где создан socket.on) ни по стеку.
на
$1"#"$2