将javascript函数作为参数传递

时间:2013-06-29 21:15:05

标签: javascript function

在处理一些javascript时,我遇到的行为令我感到困惑,我正在寻找一些解释发生了什么的文档。

问题似乎在于,根据函数的传递方式,当我认为它们只是参数时,它们可能会被执行。

这是一个简单的例子:

function f1()
{
    alert('f1');
}
function f2()
{
    alert('f2');
}
function f3(a, b)
{
    alert('f3');
}

调用上述内容的两个版本:

f3(f1, f2);        // shows 1 alert
f3(f1(), f2());    // shows 3 alerts

上面第一次调用f3导致f1和f2函数没有被调用,你得到一个“f3”警报。调用f3函数的第二次调用,因此您可以获得“f1”,“f2”和“f3”的三个警报。

在实际代码中,我将使用第一个版本,以便f3可以决定是否要调用f1和f2。我花了一点时间才弄清楚它。

我没想到这种行为,并且认为无论有没有括号,f1和f2都不会被称为参数。

同样,我正在寻找一些解释其工作原理的文档。

4 个答案:

答案 0 :(得分:2)

在你的第二行:

f3(f1(), f2());

传递 f1f2正在调用,并将其(未定义的)返回值传递给{{1 }}

答案 1 :(得分:1)

简单地说,将()添加到函数中,即使作为参数传递也会立即调用该函数。设置超时的示例:

function doStuff() {
    alert("ok");
}

setTimeout(doStuff(), 300);

您将立即收到ok的提醒,因为该功能会立即被调用。使用以下命令设置超时:

setTimeout(doStuff, 300);

仅在调用超时时才会发出警报,因为您正在将该函数作为参数正确传递。

您通常会在AJAX回调函数中看到作为参数传入的函数。

setTimeout的文档有一个关于回调函数的很棒的部分:https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

(是的,我知道问题中没有使用setTimeout,但我觉得这个例子很好地回答了这个问题)

答案 2 :(得分:0)

你的逻辑令人费解。您正在传递您从未使用过的参数,但让我们滚动 用拳头。

您的问题涉及警报的数量; 您将参数传递给从不使用它们的函数并调用它。 所以实际发生的是:

function f3(a, b)
{
console.log("argument 1: " + arguments[0]); //Access the arguments fed to the function
console.log("argument 2: " + arguments[1]); 
    alert('f3');
}
*

f3(f1, f2); 弹出提示“f3”*

and logs:
argument 1: function f1()
{
    alert('f1');
}
argument 2: function f2()
{
    alert('f2');
}

f3(f1(),f2())

弹出所有提醒 和日志:

argument 1 undefined
argument 2 undefined

答案 3 :(得分:0)

当一个函数有参数时,它非常清楚,括号用于立即调用它

function sum(a, b){
    return a + b;
}

console.log( sum(1, 2) ); //prints 3

f()版本只是一个特例,您的参数列表为空。