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

値を変更するにはaa変数はグローバル スコープにないため、別の関数からアクセスできますか? アクセスしたいのですが、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

ただし、関数を微調整してページ上の別の要素の値を設定する方法があり、他の人がその値を参照できます。スクリプトに同じコード スニペットを使用すると、更新時にページの非表示フィールドの値を設定でき、他のユーザーがその値を参照できます。関数の外で宣言する必要があると思う他の方法。

代替 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 の値で宣言することです。呼び出し元は必要に応じてそれを無視でき、他の人はそれを取得できます。これは、RunSlide 関数を再呼び出しする setTimeOut では機能しない場合があります。SlideShow 内で別の内部関数を試しましたが、いずれかを返すようには見えませんでした。元のスコーピングの提案が残っています。

于 2012-07-15T15:57:05.187 に答える