2012-03-31 48 views
3

我有一個JavaScript函數,如果它是匿名的,但工作正常,但當我將其更改爲named時停止工作。爲什麼?無法訪問命名的javascript函數中的元素

這裏是工作的代碼:

setInterval(function(){ 
<% @root.children.all(:order => "idx DESC").each do |child| %> 
     var text2 = "<%= child.content %>"; 
     var pjs = Processing.getInstanceById("mysketch2"); 
    pjs.update(text2); 
    <% end %> 

}, 3000) 

這裏是行不通的代碼..

<script> 
    var interval = setInterval(drawGraph(),1000); 
    function drawGraph(){ 
    <% @root.children.all(:order => "idx DESC").each do |child| %> 
     var text2 = "<%= child.content %>"; 
     var pjs = Processing.getInstanceById("mysketch2"); 
     pjs.update(text2); 
     <% end %> 

    } 

</script> 

我得到「遺漏的類型錯誤:無法調用‘未定義更新’ 」。最奇怪的部分是,我可以看到Processing.js窗口正在屏幕上繪製,但就是這樣。使用工作版本(本文中的第一個),一切都很好,並且窗口的內容也會繪製出來。

我試圖將pjs放入drawGraph()函數以外的全局變量,但沒有運氣... 我錯過了什麼? 謝謝!

+0

難道是drawGraph函數必須在setInterval中的調用之上定義嗎? – TGH 2012-03-31 20:40:44

+0

只是爲了完成圖片 - 這是可能的,但不推薦,因爲它執行的隱式eval:var interval = setInterval(「drawGraph()」,1000); – mplungjan 2012-03-31 20:49:28

回答

2

應該

setInterval(drawGraph,1000); 

setInterval(drawGraph(),1000); 

而且功能應setInterval聲明

+0

非常感謝! – Stpn 2012-03-31 20:52:23

+0

如果我想用參數調用drawGraph,該怎麼辦?像drawGraph(id)? – Stpn 2012-03-31 20:55:17

+0

使用綁定。例如: var f = function(id){...}。bind(someId); setInterval(f,1000); – 2012-03-31 21:00:59

2

兩個代碼片段之前被宣佈是不相等的:在第一個你正在傳遞給setInterval函數對未命名函數的引用。在第二個代碼段中,您將調用drawGraph(),然後將結果值傳遞給setInterval。

嘗試用:

var interval = setInterval(drawGraph, 1000); 

和調用的setInterval前移動drawGraph的定義。