在for循环中创建局部作用域,进入全局作用域

时间:2017-12-05 18:37:25

标签: javascript variables for-loop global-variables global-scope

我一直在寻找,但我无法得到明确的答案。 (我是javascript中的初学者,这是控制台内部的测试/练习)如何在for循环中创建局部作用域,这是一个全局作用域,因此我可以将其添加到带有对象数组的变量中。例如 : 我希望用户在名为“stars”的变量(提示符)中设置电影中有多少个星级(评级)。然后能够在对象/数组中的movieDb变量内调用它,其中它表示“rating:”...使用变量星,这样它就可以控制用户输入的星号和其他信息。这是允许的还是有不同的方法?

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

3 个答案:

答案 0 :(得分:0)

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

希望这会有所帮助

快乐学习

Vatsal

答案 1 :(得分:0)

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

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

var i = "aaa";

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

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

我认为您面临的问题是stars不存在 您可以将其设置为falsenull(或任何值),然后将其设置为您通过提示获得的数字,或者只有在您拥有该值时设置它:

{
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在离开循环之前递增)

答案 2 :(得分: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/