在使用一些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作为参数来调用它们。
再说一次,我正在寻找一些文档来解释这是如何工作的。
发布于 2013-06-30 05:27:19
在您的第二行中:
f3(f1(), f2());传递的不是f1和f2,而是调用它们,并将它们(未定义)的返回值传递给f3。
发布于 2013-06-30 05:26:15
简单地说,将()添加到函数中,即使作为参数传递,也会立即调用该函数。设置超时的示例:
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-30 05:23:50
你的逻辑令人费解。您正在传递您从未使用过的参数,但让我们面对挑战吧。
您的问题涉及到警报的数量;您正在将参数传递给从不使用它们的函数,然后调用它。所以实际发生的情况是:
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); Pops警报"f3"*
and logs:
argument 1: function f1()
{
alert('f1');
}
argument 2: function f2()
{
alert('f2');
}f3(f1(),f2())
弹出所有警报和日志:
argument 1 undefined
argument 2 undefinedhttps://stackoverflow.com/questions/17384762
复制相似问题