Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将for循环中的局部作用域转换为全局作用域_Javascript_Variables_For Loop_Global Variables_Global Scope - Fatal编程技术网

Javascript 将for循环中的局部作用域转换为全局作用域

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 =[ {

我一直在寻找,但我不能得到一个明确的答案。我是javascript的初学者,这是控制台中的一个测试/实践,我如何在for循环中创建一个局部作用域,一个全局作用域,然后我可以将其添加到带有对象数组的变量中。例如: 我希望用户设置名为stars的variableprompt中播放电影的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);
}'

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