2012-03-20 87 views
2

您好我對JavaScript和jQuery相對較新,並試圖創建一個函數的間隔100毫秒的運行時,我遇到了一個問題。我似乎進入控制檯的螢火蟲和錯誤的女巫說clasing()不是defined.This是我的代碼:jQuery setInterval()未定義函數錯誤

$(document).ready(function() { 
    var prev = $("img.selected").prev(); 
    var curent = $("img.selected"); 
    var next = $("img.selected").next().length ? $("img.selected").next() : $("img:first"); 

    $("img").not(":first").css("display","none"); 

    function clasing() { 
     curent.removeClass("selected"); 
     next.addClass("selected"); 
    } 

    setInterval("clasing()",100); 
}); 

我在做什麼錯在這裏謝謝

+1

可能重複:http://stackoverflow.com/questions/2162267/setinterval-and-window-onload-problem – jbabey 2012-03-20 20:00:06

回答

5

您有範圍問題。您的變量(prev,curentnext)可在.ready範圍內訪問,例如您的功能clasing。但是,當您添加此函數以在間隔中調用時,使用setInterval,此函數應位於全局範圍內(在window對象內)。然後,你應該聲明這個函數像window.clasing = function(){ ... },但是,這樣做,在.ready()作用域中聲明的變量將無法在該作用域外運行,因此所有變量也必須位於全局作用域中。這應該可以解決你的問題。

但是,這不是一個好的編程習慣,你應該在clasing函數中聲明你的變量,那麼它們只能在函數範圍內訪問;並且你的函數必須在.ready()函數外部展開,然後你聲明.ready()函數內的區間。

所以,你的代碼應該liek這樣的:

function clasing(){ 
    var prev = $("img.selected").prev(); 
    var curent = $("img.selected"); 
    var next = $("img.selected").next().length ? $("img.selected").next() : $("img:first"); 

    curent.removeClass("selected"); 
    next.addClass("selected"); 
} 
$(document).ready(function() { 
    $("img").not(":first").css("display","none"); 
    setInterval("clasing()",100); //or just setInterval(clasing,100); 
}); 
3

變化setInterval("clasing()",100);setInterval(clasing,100);

+0

嗯,這是一個善意的提醒,而不是一個答案...有字符串的「超載」,用'eval'解析 – gdoron 2012-03-20 19:56:08

+0

@eval傳遞函數引用而不是字符串將修復範圍問題。看到[相關的問題](http://stackoverflow.com/questions/2162267/setinterval-and-window-onload-problem) – jbabey 2012-03-20 19:59:38

+0

它不是答案...兩個'setInterval('clasing()',100) '和'setInterval(clasing,100)'會觸發未定義函數的錯誤,因爲問題是關於函數範圍的。 – 2012-03-20 20:11:03

3

變化

setInterval("clasing()",100); 

setInterval(function() { 
    clasing(); 
}, 100); 

現在您對setInterval調用在全球範圍內運行,但你的函數是你的jQuery函數中定義。創建一個閉包將使您可以訪問jquery函數成員。