Javascript 为什么这个for循环在不传递递增变量的情况下工作?

Javascript 为什么这个for循环在不传递递增变量的情况下工作?,javascript,typescript,for-loop,Javascript,Typescript,For Loop,我的代码被编译成以下代码,它可以工作,但我不知道为什么。引用递增值的变量不作为参数包含在for循环中 var _loop2 = function _loop2() { var p = document.createElement('p'); p.setAttribute('class', 'location__result'); p.setAttribute('data-id', response.features[i].id); p.setAttribute('

我的代码被编译成以下代码,它可以工作,但我不知道为什么。引用递增值的变量不作为参数包含在for循环中

var _loop2 = function _loop2() {
    var p = document.createElement('p');
    p.setAttribute('class', 'location__result');
    p.setAttribute('data-id', response.features[i].id);
    p.setAttribute('data-center', response.features[i].center);
    p.textContent = response.features[i].place_name;
    p.addEventListener('click', function () {
        endingInput.value = p.textContent;
        endingResults.style.display = "none";
        placeIconAndZoom(p, position);
    });
    endingResults.appendChild(p);
};

for (var i = 0, length = response.features.length; i < length; i++) {
    _loop2();
}
var _loop2=函数_loop2(){
var p=document.createElement('p');
p、 setAttribute('class','location\uuuu result');
p、 setAttribute('data-id',response.features[i].id);
p、 setAttribute('data-center',response.features[i].center);
p、 textContent=response.features[i].place\u name;
p、 addEventListener('click',函数(){
endingInput.value=p.textContent;
endingResults.style.display=“无”;
PlaceIcondZoom(p,位置);
});
endingResults.appendChild(p);
};
对于(var i=0,length=response.features.length;i
在另一个函数(
y
)中声明的函数(
x
)可以访问
x
范围内的所有变量(除非它们被另一个同名变量屏蔽)

y
也可以是全局范围或模块范围,而不是函数本身

var i=“示例”;
函数x(){
控制台日志(i);
}

x()这是为什么ES6中引入了
const
let
的经典案例

var有一个函数级别的作用域。这与const和let的作用域不同,在作用域中,var中定义的变量可以在hits函数声明中的任何位置访问

在您的例子中,我们在for循环(函数级范围)中声明var i,而for循环正在调用_loop2函数。因为_loop2是for loops函数作用域的一部分,所以您可以访问该变量

这个答案比我能解释的好一百万倍:


您可以通过在脚本文件的顶部添加:
使用“strict”
来修复此问题,但更好的方法是避免同时使用var(除非有特殊情况),并将其切换到:@Ruzihm的
let

可能的副本:我认为这不是一个闭包。我认为@TylerRoper是对的。
i
声明被提升到作用域的顶部。这是一个闭包,它还会是什么?@CodeBling我主要指的是“最简单的闭包示例”,剩下的示例是,变量
i
\u loop2
找到,因为它在它的闭包中。“var是一个全局作用域”-不,它不是。它是功能级别的范围,而不是全局范围<代码>“使用严格的”
(您将引号放错了位置)对使用
var
声明的变量没有影响。您将其与未使用任何作用域关键字(
var
let
const
)声明的全局变量相混淆。很抱歉,让我编辑我的答案以使其更具体,谢谢大家的编辑:
“use strict”
,您仍然得到错误的语法在这里仍然不会有任何区别。