javascript

时间:2017-10-22 19:18:47

标签: javascript

为什么我们在这个函数var i;中使用没有赋值的变量:

function showSlides() {
    var i;

    var slides = document.getElementsByClassName("mySlides");
    for (i = 0; i < slides.length; i++) {
        slides[i].style.display = "none"; 
    }
    slideIndex++;
    if (slideIndex > slides.length) {slideIndex = 1} 
    slides[slideIndex-1].style.display = "block"; 
    setTimeout(showSlides, 2000); 
}

我的意思是它的工作没有这个,所以我很好奇它是什么,我知道我们可以在循环中检查值是否未定义,但我没有看到另一种用法

5 个答案:

答案 0 :(得分:1)

变量在循环中使用几行之后。使用var关键字声明变量时,变量是&#34;悬挂&#34;到函数的开头,所以即使你写了:

function showSlides() {
    var slides = document.getElementsByClassName("mySlides");
    for (var i = 0; i < slides.length; i++) {
        slides[i].style.display = "none"; 
    }
    slideIndex++;
    if (slideIndex > slides.length) {slideIndex = 1} 
    slides[slideIndex-1].style.display = "block"; 
    setTimeout(showSlides, 2000); 
}

变量i仍然在函数顶部声明技术

如果完全省略变量声明,i变量最终会在全局范围内出现,这会导致问题,因为它将与其他无法在本地声明变量的函数共享 - 所以你会最终会产生副作用(而且很难调试)。

答案 1 :(得分:1)

使用var(或在现代JavaScript中使用letconst)定义变量以设置变量的范围非常重要。

使用var定义的变量在定义它的函数内有效。如果省略声明,代码仍然有效,但i将在全局范围内定义,并可能干扰使用相同变量名的其他函数。

你把var语句放在哪里实际上并不重要,但最好把它放在函数的开头,以使代码更容易阅读并避免错误。

你可能也写过这样的代码:

function showSlides() {
    var slides = document.getElementsByClassName("mySlides");
    for (var i = 0; i < slides.length; i++) {
        slides[i].style.display = "none"; 
    }
    slideIndex++;
    if (slideIndex > slides.length) {slideIndex = 1} 
    slides[slideIndex-1].style.display = "block"; 
    setTimeout(showSlides, 2000); 
}

答案 2 :(得分:0)

其中一个原因是范围界定(如果您在全球范围内):

Lats说我有以下功能

function test(){
   //code code code
   i=3
   //code code code
}

现在我可以从功能测试之外访问我了。但如果我这样做:

var i;
function test(){
   //code code code
   i=3
   //code code code
}

现在&#34;我&#34;在功能测试之外与&#34; i&#34;在那个功能里面。这是否是一个好的代码设计是另一个讨论。

答案 3 :(得分:0)

因为它用于for循环中的索引值并在for循环的初始值部分中初始化,所以使用它是安全的。它的表现如下:

&#13;
&#13;
var some_value = 10;
for(var i = 0; i < some_value; i++){
   console.log(i, "looped");
}
console.log(i);
&#13;
&#13;
&#13;

等于

&#13;
&#13;
var some_value = 10, i;
for(i = 0; i < some_value; i++){
   console.log(i, "looped");
}
console.log(i);
&#13;
&#13;
&#13;

我可以在相同的范围(你的情况下的函数体)中使用,因为它在相同的范围内定义。

答案 4 :(得分:0)

添加到@芬顿的回答:

  • 在旧版JavaScript中,您甚至不需要声明变量。但你绝对应该。在源代码的开头添加"use strict";以确保您不会忘记;

  • 遗留JavaScript中变量的范围并不明显。即使JavaScript是C风格,变量也没有块范围,但功能范围。因此,最好在函数开头声明所有变量,以使其清晰明确。

相关问题