Я просматривал некоторые сегодня, когда столкнулся со следующим соглашением:
TestParam(1);
function TestParam(p){
var p = p + 1;
alert(p); // alerts '2'
}
Теперь, очевидно, разработчик не имел в виду delcare 'p' внутри функции, вместо этого возможно имел в виду:
p = p + 1;
Но код все еще работал, то есть значение, о котором сообщалось, было «2». Так что это заставило меня задуматься. Что произойдет в следующем сценарии:
var a = 1;
TestParam(a);
alert(a); // alerts "1"
function TestParam(p){
var p = p + 1;
alert(p); // alerts '2'
}
Опять же, предупреждения были, как я и подозревал (как указано в комментариях выше). Тогда мне было любопытно, что произойдет, если я воспользуюсь объектом:
var a = { b: 1 };
TestParam(a);
alert(a.b); //alerts 1
function TestParam(p) {
var p = {b:p.b + 1};
alert(p.b); //alerts 2
}
Таким образом, в этом случае JavaScript «запомнил» переменную a
, даже если она передается в TestParam как p
, p
повторно объявлено.
Теперь, если бы я сделал следующее в рамках функции, тогда оба оповещения были бы "2"
p.b++;
//var p = {b:p.b + 1};
т.е. это изменило бы член b
исходного объекта. Я понял это. Это предыдущий сценарий, который ставит меня в тупик!
Я понимаю, что это довольно гипотетический вопрос, который вряд ли принесет много полезного в реальном мире, но он все же заставил меня любопытно узнать, что происходит в фоновом режиме, и как именно JavaScript определяет и ссылается на эти переменные .
Есть мысли?