- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
let windows = [];
for(let i=0;i<30;i++) {
windows.push(open('about:blank', 'w'+i, 'width=220,height=220'));
windows[windows.length-1].document.write('<img width="200" src="https://yandex.ru/images/_crpd/QXyR57D17/58778cEG/ztbSEyQN1MQPOKIh-mQphsVGWJdV_rEIEfYazmN1g0xPpX0igbVWfIKWpfMEAObKC6K6ZWrKj3oC51h2Nj70EtoS5kOEGYXVP10XoFpA">');
}
let x = 0;
for(let i=0;i<30;i++) {
setTimeout(function run() {
if(x > 10000) {
windows[i].close();
return;
}
x++;
windows[i].moveTo((Math.random()*screen.width).toFixed(), (Math.random()*screen.height).toFixed());
setTimeout(run, 100);
});
}
Кстати, лови палочку.
У некоторых браузеров замыкание захватывает значение x, текущее на момент вызова замыкания. Т. е. замыкание хранит ссылку на x. Поскольку замыкание вызывают после цикла, а после цикла значение x равно трём, то получается [3,3,3].
У других же браузеров замыкание захватывает значение x, текущее на момент создания замыкания. Т. е. x передаётся по значению. Поэтому создаётся три разных замыкания, каждое со своим значением x, и на выходе получается [1,2,3].
& означает захват по ссылке.
Я не говорю уже про кресты, где тоже захват явно по значению или по ссылке.
В «Питоне» есть атрибуты global и nonlocal, которые подсказывают, откуда именно можно захватить, но это всё равно не то.
Слабаки.
ANS 94 — чуть больше 200 страниц.
> non-compliant browsers
Как всегда IE?
Non-compliant browsers — это как минимум старые «Фуррифоксы», которые были ещё не на «Растишке», и «Сафари» (там не «V8», а свой движок).
Так вот «Goanna 3.x» — non-compliant, а «Goanna 4.x» — compliant.
Страшно, когда в разных версиях одного браузера код работает по-разному?
Надо посмотреть.
arr мы не захватывали, он же просто попадает в тело цикла из обрамляющего блока.
У меня в хроме пример хурозвоза выдал выдал 1,2,3.
Запустим вот такой код (в комментариях - то, что получил я):
И 1, 2, 3 vs 3, 3, 3 - вышедший наружу обсуждавшийся выше философский вопрос о том, создаётся ли новая переменная с тем же именем внутри цикла, или же там она каждый раз новая.
Похоже, что и вправду дело не в передаче по значению, а в реализации цикла (создание нового объекта на каждой итерации или изменение значения существующего объекта).
> У некоторых браузеров замыкание захватывает значение x, текущее на момент вызова замыкания.
Это у каких?
Приведи реальный пример.
https://stackoverflow.com/questions/36684191/using-const-in-es6-for-of-loop
Там только написано «Some non-compliant browsers», а реальных примеров автор так и не привёл.
http://govnokod.ru/26280#comment518162
В «Goanna» (форк «Gecko») в версии 3.x было «non-compliant», а в 4.x сделали «compliant».
Надо ещё посмотреть, как было сделано в самых первых версиях браузерных движков, когда слово «let» только-только появилось («Хром 41...48», «Safari 10», «IE 11»).