在Javascript中将函数作为参数传递

时间:2011-11-11 16:38:15

标签: javascript function arguments

我真的很挣这个 - 确定我错过了一些简单的东西。

这是代码: -

function webcamupdate(webcamurl) {
    alert("I am a function to update the webcam with the url "+webcamurl);
}

function countdown(callback) {
    alert(callback);
    setTimeout("callback()", 10000);
}

var theurl = "THIS IS THE URL";

countdown(function(){ webcamupdate(theurl); });

正如你所看到的,我正在试图建立一个倒计时功能(有更多的代码,但我刚刚发布了基础知识),这将在10秒后运行一个功能(在这种情况下更新网络摄像头)。

如果函数没有参数,则一切正常,但是coundown函数中的警报(回调)会返回以下内容: -

  

function(){webcamupdate(theurl); }

当webcamupdate函数运行时,这当然会导致脚本崩溃,因为没有定义“webcamurl”。

实际需要说的是什么警报(回调): -

  

function(){webcamupdate(“这是网址”); }

即。它在使用函数传递之前评估参数“theurl”。

非常感谢任何想法

修改

我想我可能误导了我使用警报而不是功能(我只是想保持简单!)

这是原始代码(仍然缩减,但会给你一个更好的主意)。

function webcamupdate(url) {
    document.getElementById("cruisecam").src=url+"&rand="+Math.random();
    countdown(30,"Webcam",function(){ webcamupdate(url); });
}

function countdown(currentcount,displayelement,callback) {
    var displaytext;
    if (currentcount == 0 ) displaytext = displayelement+" is refreshing now";
    else displaytext = displayelement+" updating in "+currentcount+" seconds";
    if (trackingcountdown.hasChildNodes()) clearelement("trackingcountdown");
    trackingcountdown.appendChild(document.createTextNode(displaytext));
    if (currentcount == 0) {
        countdown(currentcount,displayelement,callback)
    }
    else {
        currentcount--;
        var countdownparameters=currentcount+',"'+displayelement+'",'+callback;
        setTimeout("countdown("+countdownparameters+")", 1000);
    }
}

//The function is called on window loading with
//countdown(30,"Webcam",function(){ webcamupdate(url); });

//clearelement is another function (not listed) that clears the node.

基本上,它是重要的倒计时功能 - 它需要3个参数 - 以秒为单位的倒计时时间,显示倒计时的DOM元素,以及在超时时运行的功能。

如果第三个参数(函数)没有自己的任何参数 - 例如网络摄像头() - 它运行正常,但是当我们尝试添加网络摄像头(“webcampic.jpg”)时,由于尝试运行网络摄像头(网址)而不是网络摄像头(“webcampic.jpg”),它无法正常工作。

显然最简单的解决办法就是让url成为一个全局变量,但这不是一个好习惯,并且会阻止我通过js文件在其他页面上使用倒计时代码。 帮助!

3 个答案:

答案 0 :(得分:3)

只需从callback()更改为传递函数引用即可。

function webcamupdate(webcamurl) {
    alert("I am a function to update the webcam with the url "+webcamurl);
}

function countdown(callback) {
    alert(callback);
    setTimeout(callback, 10000);
}

var theurl = "THIS IS THE URL";

countdown(function(){ webcamupdate(theurl); });

答案 1 :(得分:0)

var theURL = "THIS IS THE URL";

function webCamUrlUpdate( url ) {
    alert( "I am a function to update the webcam with the url " + url );
}

function countDown( callback ) {
    setTimeout( callback, 10000 );
    alert( callback );
}

countDown(function () {
    /* IMPORTANT: need to return that other function */
    return webCamUrlUpdate( theURL );
});

您实际上希望返回该函数,以便setTimeout( callback, 10000 );按预期运行。当您在Javascript中提醒函数时,它与alert(callback.toString())相同,以获取函数头和正文的完整字符串版本。

http://jsfiddle.net/btleffler/xJ5uw/

有趣的是,如果你在setTimeout()之前提醒回调,那么回调似乎不会被激活。如果您注释掉第一个警报,或者在设置超时后发出警报,它就可以正常工作。我只在Chrome中测试过,所以我想做更多的研究。

无论哪种方式,在实际调用函数之前,您不能对函数的参数进行javascript解析(或处理或其他)。你可以让countDown()中的匿名回调通过自己提醒网址。

答案 2 :(得分:0)

好的伙计 - 我自己终于解决了 - 这是其他人的解决方案。

首先创建一个返回函数的函数:

function createfunctionwebcamupdate(url) {
    return function(){ webcamupdate(url); };
}

然后设置一个变量以在调用函数时触发该函数:

webcamupdatefunction = createfunctionwebcamupdate(url);

然后将此新变量称为回调函数:

function(){ webcamupdatefunction(); }

当调用变量时,Javascript显然会记住存储在createfunction部分中的变量。

希望这有帮助。