определяются две переменные:
function(foo, bar)
Вы передаете два значения в них:
}(foo, foo.bar))
Значение foo
является ссылкой на объект (т.е. объект имеет свойство bar
значение которого является ссылкой на другой объект)
Значение переменной bar
является ссылкой на этот второй объект.
foo.bar = 'a';
Вы перезаписать bar
свойство первого объекта со строкой 'a'
. foo.bar
больше не является ссылкой на второй объект. Значение bar
по-прежнему является ссылкой на второй объект.
bar = 'b';
перезаписывается локальной bar
переменного со строкой 'b'
. В настоящее время нет ссылок на второй объект слева. Второй объект будет собирать мусор.
console.log(foo.bar)
Вы выводить значение bar
свойства объекта, что значение foo
является ссылкой. Это 'a'
, так как вы изменили значение этого свойства в функции.
Не совсем корректно. Попробуйте следующее: 'var foo = {bar: {}}; (function (bar) {bar = 'b';} (foo.bar)); console.log (foo.bar); ' – SimonSimCity
@SimonSimCity - это просто удаляет все экземпляры модификации« первого объекта », поэтому, когда вы запускаете console.gog, вы получаете второй объект (потому что вы не перезаписали свойство bar * * первого объекта). Как это противоречит моему ответу? – Quentin
@SimonSimCity Что об этом? Он работает так, как я ожидаю. – Scimonster