2

在使用一些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

4 回答 4

2

在你的第二行:

f3(f1(), f2());

您没有传递 f1and f2,您正在调用它们,并将它们的(未定义的)返回值传递给f3.

于 2013-06-29T21:27:18.887 回答
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的,我意识到问题中没有使用,但我觉得这个例子有助于很好地回答这个问题)

于 2013-06-29T21:26:14.807 回答
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
于 2013-06-29T21:23:49.963 回答
0

当一个函数有参数时,很明显括号用于立即调用它

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

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

f()版本只是参数列表为空的特殊情况。

于 2013-06-29T21:29:03.883 回答