0

我一直在寻找,但我无法得到明确的答案。(我是 javascript 的初学者,这是控制台内的测试/练习)我如何在 for 循环中创建一个本地范围,一个全局范围,然后我可以将它添加到带有对象数组的变量中。例如:我希望用户在名为“stars”的变量(提示)中设置一部电影有多少颗星(评级)。然后可以在对象/数组中的movieDb变量中调用它,其中显示“评级:”......使用变量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);
}'
4

3 回答 3

1

我不确定我是否完全理解了你的问题,所以如果我说了一些愚蠢的话或回答你没有问的问题,请不要犹豫纠正我。

在 for 循环范围内定义变量的最佳方法是使用let.

var i = "aaa";

for (let i = 0; i < 10; i++) {
    console.log(i); // => 0...9
}

console.log(i); // => "aaa"

我认为你面临的问题是stars不存在的。
您可以将其设置为falseor 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 在离开循环之前递增)

于 2017-12-05T18:53:04.827 回答
0

我想如果我了解您要达到的目标,这应该会有所帮助...

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);

https://jsfiddle.net/ramsmxms/

于 2017-12-05T18:57:57.010 回答
0

javascript 中的 var 具有函数作用域。因此,即使您在 for 循环内定义它,它们也将在循环外可用。如果您在循环之前执行 console.log,则该值将是未定义的,如果您在循环之后执行此操作,则该值将是循环内的最后一个可用值。要使事物成为块范围(循环内的局部范围),请使用 let & const。它们在 ES6 中可用,并且所有主要浏览器都支持它们。

希望这会有所帮助

快乐学习

瓦萨尔

于 2017-12-05T18:47:16.113 回答