странная ситуация
Доброго дня!
Вот примерно такая ситуация, имеем (для простоты сокращаю текст): let logInfo = { queryVAR : { abonent: false }.......}; return __this.addRecordInUserLog( options,logInfo ) - это promise ниже представлена цепочка вызовов addRecordInUserLog readAbonentRecord initSQLVAR и вот в послледней процедуре initSQLVAR стоит строка ...... код initSQLVAR ...... argument.queryVAR['abonent'] = true; т.е. меняется базовое (начальное) значение параметра. так вот что получается (смотрим отладчиком) уже на первой строке функции readAbonentRecord этот параметр уже установлен в true!!!! т.е. перед заходом в функцию - false, только зашли - сразу true меняем присвоение в функции initSQLVAR например argument.queryVAR['abonent'] = 'hello world' теперь сразу как только заходим в функцию readAbonentRecord - получаем 'hello world' И последнее если иницциализируем переменную как строку: let logInfo = { queryVAR : { abonent: "false" }.......}; то таких замещений не происходит help me!!!!! p.s. - в других местах присвоения argument.queryVAR['abonent'] нет |
Почитайте: https://learn.javascript.ru/object-copy
|
разницу работы с переменными по ссылкам и работа с переменными созданными на стеке или в памяти я понимаю.
поясню вопрос. 1 передаем в функцию переменную (по ссылке) 2 код еще не дошел до строки в которой происходит модификация данной переменной, а переменная уже изменилась в соответствии со строкой кода мы еще не дошли до строки в которой модифицируется код!!! |
переделал логику и забил.
вдогонку вот такой еще момент: это код процедуры initSQLVAR(argument){ let queryVAR = ''; let queryText = ''; if( argument.queryVAR === undefined ) argument.queryVAR = {} else{ if(argument.queryVAR[argument.table] === true ) return ''; } //--- перебираем поля таблицы базы данных ----------------------------------------------------- for (let item in global.system.schemaSQL[argument.table]){ let varSQL = '@'+argument.table+'_'+item; if( argument.queryVAR[argument.table] ){ queryVAR += 'DECLARE '+varSQL+' '+global.system.schemaSQL[argument.table][item].typeData+';\n' } queryText += (queryText.length === 0 ? '' : ',') + varSQL+'='+item; } //--- if( queryVAR.length > 0) queryVAR = "/* декларация переменных*/\n"+queryVAR //--- присоединение к описанию переменных текста запроса -------------------------------------- queryVAR += '/* запрос инициализации декларированных переменных*/\nselect '+ queryText+' from [dbo].'+ argument.table if( argument.ROWID !== undefined ) queryVAR += ' where ROWID='+ argument.ROWID; argument.queryVAR[argument.table] = 'world'; return queryVAR+';\n' } в таком варианте когда заходим (глубоко вверху по иерархии ) переменная проинициализированная в false сразу после вызова следующего уровня иерархии принимает значение argument.queryVAR[argument.table] = 'world'; но если в этом процедуре строку if( argument.queryVAR[argument.table] ){ заменить на if( argument.queryVAR[argument.table] === undefined ){ все работает как надо. понимаю что какой то глюк в коде, но очень странное поведение JS вопрос снят, thanks |
fxobject, в консоли тоже объекты по ссылке. Т.е. в консоли ты видишь последнее состояние объекта, а не то что было при console.log. Если тебе важно узнать точное состояние - используй JSON.stringify и т.п.
|
Часовой пояс GMT +3, время: 20:05. |