为什么我不能直接调用函数?

时间:2014-12-06 17:12:50

标签: javascript

我正在通过代码学校的一个小练习,无法弄清楚为什么我必须将函数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 个答案:

答案 0 :(得分:3)

您的buildTicket函数返回一个不使用参数的函数。

例如,在您的代码中,它返回一个函数:

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

您可以使用以下语法立即调用返回的函数:

buildTicket(parkRides, fastPassQueue, wantsRide)();

您还可以更改return中的function buildTicket行以立即发出警报而不是返回某个函数,但这可能会破坏buildTicket的其他用途,期望它返回一个函数,从而延迟警报可能会在以后需要时显示在代码中的特定点。

答案 1 :(得分:2)

这应该可以正常工作!

buildTicket(parkRides, fastPassQueue, wantsRide)();

答案 2 :(得分: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();                                    
            }
        }
    }
}