2012-07-15 53 views
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變量聲明爲全局變量。如何更改此功能中變量的值而無需製作新功能

+0

對不起,但我真的不明白這個問題。是不是隻是在'SlideShow'之外聲明'a'的情況? – freefaller 2012-07-15 15:46:52

+0

由於'a'變量不在全局範圍內,我可以從另一個函數訪問它嗎? – 2012-07-15 15:50:20

+0

正確的,通過在'SlideShow'中聲明它,只有該函數(和'RunSlide')可以訪問它。聲明它的功能之外,它將全球訪問 – freefaller 2012-07-15 15:54:01

回答

1

很簡單,在SlideShow之外聲明var a;然後它就可以全局訪問。

請記住,它仍然需要與a = 1;

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時,可以在頁面上設置隱藏字段的值,然後其他人可以引用該值。任何其他方式,我認爲你必須在功能之外聲明它。

ALTERNATE 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中的另一個內部函數,但似乎並沒有返回。原定範圍的建議仍然存在。

+0

感謝四你的代碼麥克,我很感激。在我將其更改爲上面的代碼之前,我之前嘗試了此代碼以用於我的SlideShow程序。但是,我可以訪問變量而不需要將'a'變量聲明爲全局範圍? – 2012-07-15 16:06:06

+0

添加了一些更多示例並鏈接上面的範圍。答案是「否」,如果不是全局變量,則無法訪問該變量,但有如上所述的解決方法。 – 2012-07-15 16:45:30

2

是的,變量是本地函數,所以你必須公開一個外部函數才能夠訪問它。

例如,你可以把這個最後的功能,使其返回可設置變量的函數:

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

用法:

var setA = SlideShow(something); 

後來的後來,你可以使用函數:

setA(42); 
+0

你能用你的代碼編輯我的代碼嗎?我認爲這很有趣 – 2012-07-15 16:09:12

+0

@EgaRana:我坐在旁邊,所以我沒有很好的編輯功能,但我做了一個更清晰的例子。 – Guffa 2012-07-15 16:17:35

+0

這很吸引人,雖然它確實需要一個全局變量來保存返回的函數引用 – freefaller 2012-07-15 16:19:32