2015-05-08 67 views
0

我是JavaScript新手,正在從在線教程中學習它。當前的表達式是關於函數表達式的使用,特別是 - 從函數內部返回函數表達式。錯誤/ Javascript中的警告:循環內的函數

下面的代碼:

//array of all available rides, with respective wait times 
var parkRides = [["Birch Bumpers", 40], ["Pines Plunge", 55], ["Cedar Coaster", 20], ["Ferris Wheel of Firs", 90]]; 

//array of fast pass rides, indicating next up ride 
var fastPassQueue = ["Cedar Coaster", "Pines Plunge", "Birch Bumpers", "Pines Plunge"]; 

//function to build fast pass queue using array 
function buildTicket(allRides, passRides, pick) { 

    //if user has picked the first ride in fast pass queue, alert so... 
    if(pick == passRides[0]) { 

     //remove first item from queue using shift and store it in a var 
     var pass = passRides.shift(); 

     //return function expression here 
     return function() { 
      alert("QuicK!! You've got a fast pass to " + pass + "!"); 
     }; //return ends with a ; 

    } 

    else { 
     for (var i = 0; i < allRides.length; i++) { 
      if(pick == allRides[i][0]) { 

       //return a function expression here 
       return function() { 
        alert("A ticket is printing for " + allRides[i][0] +"!\n"+ " Your wait time is about " + allRides[i][1] + " minutes."); 
       }; 
      } 

     } 
    } 

} 

//use function buildticket 
var wantsRide = "Pines Plunge"; 

var ticket = buildTicket(parkRides, fastPassQueue, wantsRide); 

//execute function expression by calling ticket() 
ticket(); 

我使用微軟的Visual Studio代碼,並在代碼的最後,我得到一個錯誤,一個警告,即使代碼成功的作品,我也得到所需結果取決於wantsRide變量。但是,我沒有理解錯誤和警告的原因。

在屏幕底部(下面的屏幕截圖),我得到1個十字和1個感嘆號圖標,我假設這意味着1個錯誤和1個警告。

enter image description here

但是,當我點擊它,我得到的,說! Function inside loop和這些行強調欄的頂部突出顯示的區域:

return function() { 
        alert("A ticket is printing for " + allRides[i][0] +"!\n"+ " Your wait time is about " + allRides[i][3] + " minutes."); 
       }; 

enter image description here

似乎什麼成爲這裏的問題?我知道這是for循環內的函數表達式,但爲什麼會生成警告?是因爲它的if(pick==allRides[i][0])聲明可能永遠不會是真的,所以函數表達式永遠不會被執行?

+1

這是一個警告,您的代碼可能有這裏描述的問題:http://stackoverflow.com/questions/1451009/javascript-infamous-loop-issue – Barmar

+0

但在這種情況下,它沒有問題,因爲它在創建函數時也會返回到循環外。 – Barmar

+0

@Barmar - 你正在使用的棉絨不夠聰明,以確定這一點。 – Quentin

回答

0

這是在黑暗中拍攝的,但可能是MSVS不能理解你的函數返回的是什麼(即另一個函數)。

這個問題可能會揭示問題的一些光:

Create javascript function that works with intellisense

(或者我可以吠叫完全錯誤的樹)

所以它可以更好地工作在MSVS如果你定義的返回值作爲「函數」類型的變量,並在適當的時候重新定義它。 喜歡的東西:

//function to build fast pass queue using array 
function buildTicket(allRides, passRides, pick) { 

    var func = new function() {} 

    //if user has picked the first ride in fast pass queue, alert so... 
    if(pick == passRides[0]) { 

     //remove first item from queue using shift and store it in a var 
     var pass = passRides.shift(); 

     func = function() { 
      alert("QuicK!! You've got a fast pass to " + pass + "!"); 
     }; //return ends with a ; 
     //return function expression here 
     return func; 

    } 

    else { 
     for (var i = 0; i < allRides.length; i++) { 
      if(pick == allRides[i][0]) { 

       func = function() { 
        alert("A ticket is printing for " + allRides[i][0] +"!\n"+ " Your wait time is about " + allRides[i][1] + " minutes."); 
       }; 
       //return a function expression here 
       return func; 
      } 

     } 
    } 

} 

雖然這並不說明爲什麼MSVS抱怨第二回電話,而不是第一個(或兩個),所以我可能是完全錯誤的(我沒有或使用MSVS) 。