Является ли console.log асинхронным? - PullRequest
0 голосов
/ 22 мая 2019

На днях в моем приложении Angular 6 произошел инцидент с кодом, который выглядел следующим образом:

console.log('before:', value);
this.changeValue(value);
console.log('after:', value);

changeValue () каким-то образом изменяет значение.Я ожидал увидеть неизмененное значение в консоли перед вызовом changeValue (), а затем измененное значение после.Вместо этого я видел измененное значение до и после.

Я предполагаю, что это доказало, что моя функция changeValue () работала, но это также указало мне, что console.log () является асинхронным, то есть неt распечатать значение на консоль сразу же;он ждет немного ... и когда он, наконец, напечатает значение, это значение будет таким, как есть в тот момент.Другими словами, первый вызов функции console.log (), приведенный выше, ждал до тех пор, пока после вызова changeValue () перед печатью не произошло, и когда это произошло, значение уже изменилось.

Так что я правильно понял, чтоconsole.log () является асинхронным.Если так, то почему?Это вызывает много путаницы при отладке.

1 Ответ

0 голосов
/ 31 мая 2019

Нет, console.log () является синхронным. На самом деле это ваша функция changeValue (), которая работает не так, как вы думаете.

Во-первых, JavaScript передает переменные не по ссылке, а по указателю на объект (как и во многих других языках). Таким образом, хотя переменная value внутри вашей функции и переменная value во внешней области видимости содержат один и тот же объект, они по-прежнему являются отдельными переменными. Мутатин объекта влияет на обе переменные, но прямые присваивания одной переменной не влияют на другую. Например, очевидно, что не будет работать:

function changeValue(x) { x = 123; }

Во-вторых, в JavaScript сокращенное назначение a += b не изменяет существующий объект, хранящийся в a. Вместо этого он работает точно так же, как a = a + b, и присваивает переменной новый . Как упоминалось выше, это влияет только на переменную внутри функции, но не влияет на переменную снаружи, поэтому ваши изменения будут потеряны после возврата из функции.

Больше примеров:

function willwork(obj) { obj.foo = "bar"; }
function willwork(obj) { obj["foo"] = 1234; }
function willwork(obj) { obj.push("foo"); }

function wontwork(obj) { obj = "foo"; }
function wontwork(obj) { obj += 123; }
function wontwork(obj) { obj = obj + 123; }
...