0
function SlideShow(area) {
    var SlideImg = new Array('img1', 'img2');
    var SlideArea = document.getElementById(area);
    for (i = 0; i < SlideImg.length; i++) {
        if (SlideImg[i] == SlideImg[0]) {
            var classname = 'active';
        } else {
            var classname = 'not-active';
        }
        var html = '<img src="images/room/' + SlideImg[i] + '.jpg" id="' + SlideImg[i] + '" class="' + classname + '" />';
        SlideArea.innerHTML += html;
    }
    var a = 1;

    function RunSlide() {
        var before = a - 1;
        if (a > SlideImg.length - 1) {
            a = 0;
        }
        ImgBefore = document.getElementById(SlideImg[before]);
        ImgBefore.className = 'not-active';
        ImgNext = document.getElementById(SlideImg[a]);
        ImgNext.className = 'active';
        a++;
    }
    var run = setInterval(RunSlide, 5000);
}

如何改变a价值?因为a变量不在全局范围内,我可以从另一个函数访问它吗?我想访问它,但不想将a变量声明为全局变量。

4

3 回答 3

2

是的,该变量是函数的本地变量,因此您必须在外部公开一个函数才能访问它。

例如,您可以将其放在函数的最后,使其返回一个可以设置变量的函数:

function SlideShow(area) {
  ...
  return function(value){ a = value; };
}

用法:

var setA = SlideShow(something);

然后稍后您可以使用该功能:

setA(42);
于 2012-07-15T15:57:46.443 回答
1

很简单,var a;在外部声明SlideShow,然后它将是全局可访问的。

请记住,它仍然需要在函数内重置a = 1;

于 2012-07-15T15:56:28.057 回答
1

如果您可以使变量的范围成为全局变量,那么您应该可以。而不是在你的函数中声明,只需引用变量并在页面的“<head>”中声明。请参阅我的示例,我对此进行了测试,单击差异链接会更改变量的值并显示在页面上。

<html>
<head><title>Test</title>
<script language="javascript">
var a = -1;

function changeVar(value) {
  a = value;
  document.getElementById("test1").innerHTML = a;
}
</script>
</head>
<body>
<h1>Test page</h1>
<a href="#" onclick="changeVar(2);">Click me (2)</a> <br />
<a href="#" onclick="changeVar(5);">Click me (5)</a> <br />
<a href="#" onclick="changeVar(9);">Click me (9)</a> <br />
<hr>
<h1>Value for a is: <div id="test1"></div></h1>

<!-- really test by including function later on page -->
<script language="javascript">
function SlideShow(area) {
    var SlideImg = new Array('img1', 'img2');
    var SlideArea = document.getElementById(area);
    for (i = 0; i < SlideImg.length; i++) {
        if (SlideImg[i] == SlideImg[0]) {
            var classname = 'active';
        } else {
            var classname = 'not-active';
        }
        var html = '<img src="images/room/' + SlideImg[i] + '.jpg" id="' + SlideImg[i] + '" class="' + classname + '" />';
        SlideArea.innerHTML += html;
    }
    a = 1;  // removed declaration of a and just using a from prior declaration

    function RunSlide() {
        var before = a - 1;
        if (a > SlideImg.length - 1) {
            a = 0;
        }
        ImgBefore = document.getElementById(SlideImg[before]);
        ImgBefore.className = 'not-active';
        ImgNext = document.getElementById(SlideImg[a]);
        ImgNext.className = 'active';
        a++;
    }
    var run = setInterval(RunSlide, 5000);
}
</script>
</html>

如果在函数中声明,则无法访问变量本身,因为它的范围是 LOCAL。见:http ://www.w3schools.com/js/js_variables.asp

但是,有一种方法可以调整函数以设置页面上另一个元素的值,然后其他人可以引用该值。为您的脚本使用相同的代码片段,当更新 a 时,您可以设置页面上隐藏字段的值,然后其他人可以引用该值。我认为您必须在函数之外声明它的任何其他方式。

替代1:

<!-- really test by including function later on page -->
<script language="javascript">
function SlideShow(area) {
    var SlideImg = new Array('img1', 'img2');
    var SlideArea = document.getElementById(area);
    for (i = 0; i < SlideImg.length; i++) {
        if (SlideImg[i] == SlideImg[0]) {
            var classname = 'active';
        } else {
            var classname = 'not-active';
        }
        var html = '<img src="images/room/' + SlideImg[i] + '.jpg" id="' + SlideImg[i] + '" class="' + classname + '" />';
        SlideArea.innerHTML += html;
    }
    var a = 1;

    function RunSlide() {
        var before = a - 1;
        if (a > SlideImg.length - 1) {
            a = 0;
        }
        ImgBefore = document.getElementById(SlideImg[before]);
        ImgBefore.className = 'not-active';
        ImgNext = document.getElementById(SlideImg[a]);
        ImgNext.className = 'active';
        a++;
        // set value of element on page so others can reference
        document.getElementById("test1").innerHTML = a;  // or set a hidden field
    }
    var run = setInterval(RunSlide, 5000);
}
</script>

您可能能够做到的另一种方法是使用 a 的值为您的函数声明一个返回值,调用者可以根据需要忽略它,而其他人可以检索它。这可能不适用于您的 setTimeOut 重新调用 RunSlide 函数。我在 SlideShow 中尝试了另一个内部函数,但似乎也没有返回。原始范围界定建议仍然存在。

于 2012-07-15T15:57:05.187 回答