将 for 循环内的局部作用域变为全局作用域
Making a local scope inside a for loop, into a global scope
我一直在寻找,但没有得到明确的答案。 (我是 javascript 的初学者,这是控制台内的 test/practice )如何在 for 循环中创建一个本地范围,一个全局范围,然后我可以将它添加到带有数组的变量中的对象。例如 :
我希望用户在名为 "stars" 的变量(提示)中设置一部电影有多少星(评级)。然后能够在 object/array 内的 movieDb 变量中调用它 "rating :" ... 使用变量 stars 以便它可以控制台记录用户输入的星星以及其他信息。这是允许的还是有不同的方法?
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 中可用,并且所有主流浏览器都支持它们。
希望这会有所帮助
快乐学习
瓦萨尔
我不确定我是否完全理解你的问题,所以如果我说了一些愚蠢的话或回答了你没有问过的问题,请不要犹豫纠正我。
在 for 循环范围内定义变量的最佳方法是使用 let
.
声明它
var i = "aaa";
for (let i = 0; i < 10; i++) {
console.log(i); // => 0...9
}
console.log(i); // => "aaa"
我认为您面临的问题是 stars
不存在。
您可以将其设置为 false
或 null
(或任何值),然后将其设置为您通过提示获得的数字,或者在您有值时设置它:
{
haswatched : "i",
title : "In Burges"
}
...
movieDb[i].stars = stars;
我不知道一开始将它设置为 Int 值是否更快,但在这种情况下这将是一个很小的改进,我不确定它是否重要。
希望对您有所帮助
编辑:
关于循环内的 let
范围,这里有一个例子:
<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);
我一直在寻找,但没有得到明确的答案。 (我是 javascript 的初学者,这是控制台内的 test/practice )如何在 for 循环中创建一个本地范围,一个全局范围,然后我可以将它添加到带有数组的变量中的对象。例如 : 我希望用户在名为 "stars" 的变量(提示)中设置一部电影有多少星(评级)。然后能够在 object/array 内的 movieDb 变量中调用它 "rating :" ... 使用变量 stars 以便它可以控制台记录用户输入的星星以及其他信息。这是允许的还是有不同的方法?
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 中可用,并且所有主流浏览器都支持它们。
希望这会有所帮助
快乐学习
瓦萨尔
我不确定我是否完全理解你的问题,所以如果我说了一些愚蠢的话或回答了你没有问过的问题,请不要犹豫纠正我。
在 for 循环范围内定义变量的最佳方法是使用 let
.
var i = "aaa";
for (let i = 0; i < 10; i++) {
console.log(i); // => 0...9
}
console.log(i); // => "aaa"
我认为您面临的问题是 stars
不存在。
您可以将其设置为 false
或 null
(或任何值),然后将其设置为您通过提示获得的数字,或者在您有值时设置它:
{
haswatched : "i",
title : "In Burges"
}
...
movieDb[i].stars = stars;
我不知道一开始将它设置为 Int 值是否更快,但在这种情况下这将是一个很小的改进,我不确定它是否重要。
希望对您有所帮助
编辑:
关于循环内的 let
范围,这里有一个例子:
<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);