在处理一些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都不会被称为参数。
同样,我正在寻找一些解释其工作原理的文档。
答案 0 :(得分:2)
在你的第二行:
f3(f1(), f2());
您传递 f1
和f2
,正在调用,并将其(未定义的)返回值传递给{{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()
版本只是一个特例,您的参数列表为空。