Javascript 将for循环中的局部作用域转换为全局作用域
我一直在寻找,但我不能得到一个明确的答案。我是javascript的初学者,这是控制台中的一个测试/实践,我如何在for循环中创建一个局部作用域,一个全局作用域,然后我可以将其添加到带有对象数组的变量中。例如: 我希望用户设置名为stars的variableprompt中播放电影的stars数。然后可以在对象/数组中的movieDb变量中调用它,其中表示rating:。。。使用可变星号,以便控制台记录用户输入的星号以及其他信息。这是允许的还是有不同的方法Javascript 将for循环中的局部作用域转换为全局作用域,javascript,variables,for-loop,global-variables,global-scope,Javascript,Variables,For Loop,Global Variables,Global Scope,我一直在寻找,但我不能得到一个明确的答案。我是javascript的初学者,这是控制台中的一个测试/实践,我如何在for循环中创建一个局部作用域,一个全局作用域,然后我可以将其添加到带有对象数组的变量中。例如: 我希望用户设置名为stars的variableprompt中播放电影的stars数。然后可以在对象/数组中的movieDb变量中调用它,其中表示rating:。。。使用可变星号,以便控制台记录用户输入的星号以及其他信息。这是允许的还是有不同的方法 var movieDb =[ {
var movieDb =[
{
haswatched : "i",
title : "In Burges",
rating : stars,
},
{
haswatched : "i",
title : "Frozen",
rating : stars,
},
{
haswatched : "i",
title : "Mad Max",
rating : stars,
},
]
for (var i = 0; i < movieDb.length ; i++) {
var w = prompt("did you watch the movie?")
if (w === 'yes'){//first IF
movieDb[i].haswatched = "you have watched";
var r = prompt("would you like to rate us?");
if (r === "yes") {//nested in first IF
var stars = prompt("Enters Stars");
alert("Thanks for rating & Watching!")
} else if(r === "no"){ //nested in second IF
alert("You did not rate, Thanks for watching!")
}
}
else if (w === "no"){ //first ELSE IF
movieDb[i].haswatched = "you have not seen";
}
console.log(movieDb[i].haswatched + " " + "\""+movieDb[i].title+"\"" + " -" + movieDb[i].rating);
}'
javascript中的var具有函数作用域。因此,即使您在for循环内部定义了它,它们也将在循环外部可用。如果在循环之前执行console.log,则该值将是未定义的,如果在循环之后执行,则该值将是循环中可用的最后一个值。要使事物在循环内阻塞作用域的局部作用域,请使用let&const。它们在ES6中可用,并且所有主流浏览器都支持它们 希望这会有所帮助 快乐学习
Vatsal我不确定我是否完全理解你的问题,所以如果我说了一些愚蠢的话或回答了你没有问的问题,请不要犹豫纠正我 在for循环范围内定义变量的最佳方法是使用let声明它 我不知道一开始将其设置为Int值是否更快,但在这种情况下,这将是一个非常微小的改进,我不确定这是否会有多大影响 希望能有帮助 编辑: 关于让作用域进入循环,下面是一个示例:
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
<li>e</li>
</ul>
<script>
var lis = document.querySelectorAll('li');
for (let i = 0; i < lis.length; i++) {
lis[i].addEventListener('click', function(){
console.log(i);
});
}
</script>
单击li时,显示从0到4的位置,尽管:
<script>
var lis = document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
lis[i].addEventListener('click', function(){
console.log(i);
});
}
</script>
将显示5 i在离开循环之前递增我认为如果我了解您试图实现的目标,这将有助于
var movieDb = [
{
haswatched : "i",
title : "In Burges",
rating : 0,
},
{
haswatched : "i",
title : "Frozen",
rating : 0,
},
{
haswatched : "i",
title : "Mad Max",
rating : 0,
},
];
for (var i = 0; i < movieDb.length ; i++) {
var w = prompt("did you watch the movie " + movieDb[i].title + "?")
if (w === 'yes'){//first IF
movieDb[i].haswatched = "you have watched";
var r = prompt("would you like to rate us?");
if (r === "yes") {//nested in first IF
var stars = prompt("Enters Stars");
movieDb[i].rating = stars;
alert("Thanks for rating & Watching!")
} else if(r === "no"){ //nested in second IF
alert("You did not rate, Thanks for watching!")
}
} else if (w === "no"){ //first ELSE IF
movieDb[i].haswatched = "you have not seen";
}
}
console.log(movieDb);
在比较了您的代码和我的代码之后,我意识到我没有将对象列表中的评级值设置为IF语句中的可变星。这无疑有助于支持所有其他答案。我想我问错了问题,以为这会解决我的问题。谢谢yes stars对象列表不存在,但我有评级值,并试图将可变星添加到其相等值中。我把自己弄糊涂了,没有用stars变量更新If语句中的评级对象。上面这句话的家伙帮我意识到了这一点。。谢谢你的另一个!!
<script>
var lis = document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
lis[i].addEventListener('click', function(){
console.log(i);
});
}
</script>
var movieDb = [
{
haswatched : "i",
title : "In Burges",
rating : 0,
},
{
haswatched : "i",
title : "Frozen",
rating : 0,
},
{
haswatched : "i",
title : "Mad Max",
rating : 0,
},
];
for (var i = 0; i < movieDb.length ; i++) {
var w = prompt("did you watch the movie " + movieDb[i].title + "?")
if (w === 'yes'){//first IF
movieDb[i].haswatched = "you have watched";
var r = prompt("would you like to rate us?");
if (r === "yes") {//nested in first IF
var stars = prompt("Enters Stars");
movieDb[i].rating = stars;
alert("Thanks for rating & Watching!")
} else if(r === "no"){ //nested in second IF
alert("You did not rate, Thanks for watching!")
}
} else if (w === "no"){ //first ELSE IF
movieDb[i].haswatched = "you have not seen";
}
}
console.log(movieDb);