今天是2019年的8月17日

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()传递到点击事件,使点击事件能够获取到每一次点击的位置

也是一个简单的闭包

猜你喜欢

转载自www.cnblogs.com/jiapei/p/11369034.html