Javascript 为什么这个for循环在不传递递增变量的情况下工作?
我的代码被编译成以下代码,它可以工作,但我不知道为什么。引用递增值的变量不作为参数包含在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('
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”
,您仍然得到错误的语法在这里仍然不会有任何区别。