2014-12-06 91 views
1

我正在通過代碼學校的一個小練習,不知道爲什麼我必須將函數buildTicket(parkRides, fastPassQueue, wantsRide);傳遞給一個變量,然後調用變量上的函數來使此腳本工作。爲什麼我不能直接調用一個函數?

下面的代碼將不會執行(我不分配功能給一個變量):

var parkRides = [ 
    ["Birch Bumpers", 40], 
    ["Pines Plunge", 55], 
    ["Cedar Coaster", 20], 
    ["Ferris Wheel", 90] 
]; 

var fastPassQueue = ["Cedar Coaster", "Pines Plunge", "Birch Bumpers", "Pines Plunge"]; 

var wantsRide = "Birch Bumpers"; 

function buildTicket(allRides, passRides, pick) { 
    if(passRides[0]==pick){ 
     var pass = passRides.shift(); 
     return function(){ 
      alert("Quick you have a fast pass to "+pass+"!"); 
     }; 
    } else { 
     for(var i = 0; i<allRides.length; i++){ 
      if(allRides[i][0] == pick){ 
       return function(){ 
        alert("A ticket is printing for "+pick+"!\n"+ 
          "Your wait time is about "+allRides[i][1]+" minutes."); 
       }; 
      } 
     } 
    } 
} 

buildTicket(parkRides, fastPassQueue, wantsRide); 

但是,如果我添加var ticket = buildTicket(parkRides, fastPassQueue, wantsRide); ticket();它工作正常。下面的完整代碼:

var parkRides = [ 
    ["Birch Bumpers", 40], 
    ["Pines Plunge", 55], 
    ["Cedar Coaster", 20], 
    ["Ferris Wheel", 90] 
]; 

var fastPassQueue = ["Cedar Coaster", "Pines Plunge", "Birch Bumpers", "Pines Plunge"]; 

var wantsRide = "Birch Bumpers"; 

function buildTicket(allRides, passRides, pick){ 
    if(passRides[0]==pick) { 
     var pass = passRides.shift(); 
     return function(){ 
      alert("Quick you have a fast pass to "+pass+"!"); 
     }; 
    } else { 
     for(var i = 0; i<allRides.length; i++){ 
      if(allRides[i][0] == pick){ 
       return function(){ 
        alert("A ticket is printing for "+pick+"!\n"+ 
          "Your wait time is about "+allRides[i][1]+" minutes."); 
       }; 
      } 
     } 
    } 
} 

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

ticket(); 

任何有識之士,爲什麼我需要的功能傳遞給一個變量,然後調用變量將不勝感激。我相信我在這裏很明顯地忽略了這一點。

回答

3

您的buildTicket函數返回一個不使用參數的函數。

return function(){alert("Quick you have a fast pass to "+pass+"!"); 
     }; 

你可以用這種語法立即調用返回的功能:

例如,在你的代碼,它在這裏函數返回

buildTicket(parkRides, fastPassQueue, wantsRide)(); 

你也可以改變return線在function buildTicket立即警告,而不是返回一個函數,但這可能會打破buildTicket的其他用途,期望它返回一個函數,從而延遲警報,可能顯示在鱈魚的特定點以後在需要時。

+0

是否有這個語法的名稱? – 2014-12-06 17:25:58

+0

非常感謝 - 解決了問題並給出了原因。我懷疑我也可以直接返回警報而不使用函數,並通過調用buildTicket(parkRides,fastPassQueue,wantsRide)獲得相同的結果; – 2014-12-06 17:26:57

+0

人們用匿名版本創建局部範圍,即在for循環中有一些可愛的首字母縮略詞。 IIFE立即調用函數表達式等。 – Paul 2014-12-06 17:27:12

2

這應該很好!

buildTicket(parkRides, fastPassQueue, wantsRide)(); 
+0

這個工程,以及顯然;) – 2014-12-06 17:27:20

1

當您使用變量ticket();你正在做一個更多的函數調用,否則你會做的。

基本上第一個buildTicket自己調用... buildTicket(parkRides,fastPassQueue,wantsRide);

看起來像......

(function buildTicket(allRides, passRides, pick) { 
    //... your code here that is returning a function 
}(parkRides, fastPassQueue, wantsRide); 

引擎蓋下,並會返回一個包含尚未援引又一個警報匿名函數。看起來像......

(function() { 
    //... your code containing an alert 
}); 

,並因爲它沒有被綁定到變量它只是坐在那裏不能被調用,因爲你現在有沒有對它的引用。 有兩種解決此問題的方法: 1)您已經計算出將匿名函數分配給變量並使用變量調用函數。 2)是通過添加另一組parens立即調用返回的函數。

最後,他們都做同樣的事情,最終會通過

(function() { 
    //... your code containing an alert 
})(); 

而且給你提醒,如果你想要的是調用警報,您可以對額外功能的語句忘記和回電,只是有

function buildTicket(allRides, passRides, pick){ 
    if(passRides[0]==pick){ 
     var pass = passRides.shift(); 
     alert(); 
    }else { 
     for(var i = 0; i<allRides.length; i++){ 
      if(allRides[i][0] == pick){ 
       alert();          
      } 
     } 
    } 
} 
相關問題