在使用for循环时,JS是否创建了许多范围?

时间:2018-02-04 15:19:46

标签: javascript scope

for(let i = 0;i<buttons.length;i++){
   buttons[i].onclick = function(){
      console.log(i);
   }
}

JS是否在全局范围内创建buttons.length范围?或者JS只在全局创建一个范围?

1 个答案:

答案 0 :(得分:0)

使用let代替var来定义i的原因使每个按钮在点击时记录正确 i, ,因为leti循环中定义for,而var在循环外定义它。

使用let

&#13;
&#13;
var buttons = document.getElementsByTagName("button");

for (let i = 0; i < buttons.length; i++) buttons[i].onclick =()=> console.log(i);
&#13;
<button>0</button>
<button>1</button>
<button>2</button>
&#13;
&#13;
&#13;

使用var

&#13;
&#13;
var buttons = document.getElementsByTagName("button");

for (var i = 0; i < buttons.length; i++) buttons[i].onclick =()=> console.log(i);
&#13;
<button>0</button>
<button>1</button>
<button>2</button>
&#13;
&#13;
&#13;

在引入let之前,必须提出花式方法在函数内部传递i,例如使用Immediately Invoked Function Expression。< / p>

使用IIFE

&#13;
&#13;
var buttons = document.getElementsByTagName("button");

for(var i = 0; i < buttons.length; i++) {
  buttons[i].onclick = (function (i) {
    return ()=> console.log(i);
  })(i);
}
&#13;
<button>0</button>
<button>1</button>
<button>2</button>
&#13;
&#13;
&#13;