标签:结果 声明 实参 不能 数字 document 变量 nts get
JavaScript是一门弱类型,单线程,解释性的语言
在JS的代码执行前,首先得进行预编译
1.函数在执行的前一刻,会生成一个Active Object对象
2.分析函数中的var声明,变量名作为AO对象的属性名,值为undefined, 如果遇到参数同名的话
不会做任何的改变
3.分析函数声明,函数名作为AO对象的属性名,值为函数体,如果遇到同名,则 直接覆盖之前的函数
4.函数的形参作为AO对象的属性名,实参作为AO对象的属性值
关于闭包的一串代码
<body>
<ul>
<li>0</li>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
</ul>
<script>
var lis = document.getElementsByTagName(‘li‘);
for(var i = 0 ; i < lis.length; i ++){
lis[i].onclick = function () {
console.log(i);
}
}
</script>
</body>
此时的点击事件并不能按我们预想的那样,点击什么数字在控制台显示什么数字,而是无论点击谁都是显示10
这是因为在预编译过后点击函数所获得值是for循环结束之后的最后结果,经过i++后便是数字10
我们此时为了达到预期的效果,就需要用到闭包,将for循环与点击事件绑定
var lis = document.getElementsByTagName(‘li‘);
for(var i = 0 ; i < lis.length; i ++){
(function(i){
lis[i].onclick = function () {
console.log(i);
}
})(i)
}
这是将for循环的每一个值通过function()传递到点击事件,使点击事件能够获取到每一次点击的位置
也是一个简单的闭包
标签:结果 声明 实参 不能 数字 document 变量 nts get
原文地址:https://www.cnblogs.com/jiapei/p/11369034.html