Тред просто огонь!:)
Дело в том, что такой же спор (из 8 страниц, на эту же тему) был не так давно на
другом ресурсе, где мудрый дядька под ником "javascript" объяснял окружающим (которые тоже уперлись рогом, как и многие здесь), почему в js по факту всё является замыканием.
Поэтому было крайне интересно, чем же и здесь дело закончится.
И в очередной раз было доказано, что где бы ни была объявлена функция (а начиная с es6 и let - и блок кода) - она образует замыкание с цепочкой внешних лексических сред (или хотя бы одной LE), что полностью соответствует определению, предысторию которого хорошо
описал Александр.
Что наглядно
изобразил Alexandroppolus (надеюсь, вы не будете против, если я достану
ваш пример из jsfiddle и размещу здесь, чтобы он не пропал с течением времени):
description:
функция, созданная внутри iframe, замкнула внутрифреймовую глобальную переменную, и продолжает работать, даже когда фрейм удалили. Кнопкой frameValue можно убедиться, что в window той переменной нет.
html:
<script>
var globalValue = 1000;
var globalCounter = function() {
return globalValue++;
};
</script>
<div>
<button>iframe counter</button>
<button>globalCounter</button><br >
<button>frameValue</button>
<button>globalValue</button>
</div>
JS:
const iframeHTML = 'iframe...<' + `script>
var frameValue = 1;
var counter = function() {
// debugger;
return frameValue++;
};
window.parent.iframeCounter = counter;
<` + '/script>';
function createTempFrame() {
const blob = new Blob([iframeHTML], {type: "text/html"});
const frm = document.createElement('iframe');
frm.src = URL.createObjectURL(blob);
document.body.appendChild(frm);
setTimeout(() => {
document.body.removeChild(frm);
}, 900);
}
window.onload = function () {
const buttons = document.querySelectorAll('button');
buttons[0].onclick = function() {
alert(iframeCounter());
};
buttons[1].onclick = function() {
alert(globalCounter());
};
buttons[2].onclick = function() {
alert(window.frameValue);
};
buttons[3].onclick = function() {
alert(window.globalValue);
};
createTempFrame();
};
Так что да, автор треда, который ходил на собеседование, был прав, замыкание в его примере есть.