К примеру abc это массив объектов, определенный как:
var abc = [];
После этого проверяю размер массива:
io.on('connection', function (socket) {
socket.on('connect', function(ev) {
// Но в данном случае abc не видно, мне иногда нужно сохранять данные в глобальные переменные...
if(abc.length > 0) {
var abc_ = abc; Вот таким образом я получил к ней доступ. Но я не понял почему до этого я не получал. Неужели внутри анонимной функции нужно делать переопределение глобальных переменных?
azovl: Могу рассказать только моё понимание из опыта.
Внутренняя функция видит область видимости внешней. А во внешней на этот момент нет ссылки на abc
azovl: дополню. захват области видимости происходит на момент вызова функции. обе функции на момент вызова находятся внутри io.on, соответственно захватывают стек вызовов/областей видимости только io.on
например:
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) ни по стеку.
надеюсь, эта сложная запутанность немного станет вам понятней