我在网页浏览器中测试闭包和吊装时发现了一个奇怪的问题。
第一次在浏览器中加载下面的页面时,会收到一条警告,上面写着“执行名字=”。单击浏览器页面会发出警告“嘿!”。这是预期的,因为只有var name_c='Joe'
的声明被提升。作业留在原地。再次点击页面,你会得到“嘿Sam!”因为现在已经为封闭函数内的文本框分配了名称。这是预期的。
现在意外(至少对我来说意外):刷新页面。你会得到一个警告框,上面写着“执行名字=乔”。点击页面,你会得到“嘿乔!”。再次点击页面,你会得到“嘿Sam!”。这里发生了什么?为什么乔出现?这在Chrome和Edge中适用于我。
function name_closure(name__) {
alert('executing name=' + name__);
return function() {
alert('Hey ' + name__ + '!');
name__ = document.getElementById("txtName").value;
};
}
document.onclick = name_closure(name);
var name = 'Joe';
<h1>Hoisting and Closures</h1>
<p>
<input type="text" name="txtName" id="txtName" value="Sam">
</p>