2013-06-29 150 views
2

在使用一些JavaScript时,我遇到了令人困惑的行为,我正在寻找一些解释发生了什么的文档。传递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都不会仅仅通过让它们成为参数而被调用。

再次,我正在寻找一些解释如何工作的文档。

+6

你需要知道的文档是'()'调用一个函数,否则你只是引用一个函数。你的第一行将'f1'和'f2'函数的引用传递给'f3'。你的第二行立即调用'f1'和'f2',并将它们的返回值(“undefined”,因为它们不返回任何东西)传递给'f3'。由于'f3'对'a'和'b'没有任何作用,所以如果你调用它们,通过 – Ian

+0

并不重要,你将函数的返回值作为参数传递,而不是函数本身。由于参数在传递之前已经被解决,所以js不知道在调用中实际发生了什么。在你的情况下,所有的函数都返回undefined,但是因为你从不使用参数,所有这些都没有关系。 – dandavis

+0

有些语言可以延迟函数调用。 JavaScript没有这种能力。当你打电话时,立即打电话给他。 –

回答

2

在你下联:

f3(f1(), f2()); 

你不通过f1f2,你是,他们调用,并将它们的(未定义的)返回值传递给f3

+0

简单而重要的是,爱这些答案 – Mataniko

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 
+0

永远不要使用这些功能,因为这是一个玩具的例子,剥离了所有extranous功能。当然在真正的代码中,这些函数有一个目的并被使用。 –

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在问题没有得到使用,但我觉得这个例子有助于回答很好的问题)

0

当一个函数参数的很清楚,括号是用来立即调用它

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

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

f()版本的这个地方你的参数列表是空的只是一个特例。