Pekka所说的是正确的,但是我想用一个例子详细说明一下,这将有助于向不完全理解函数指针或委托的人进行解释。
我不会使用,window.onload因为这有点想演示。我将使用一个简单的乘法函数进行演示:
function Multiply(operator, operand) {
return operator * operand;
}
同样可以这样写:
Multiply = function(operator, operand) {
return operator * operand;
}
虽然在第一个示例中,含义可能并不明显,但是第二个示例更清楚地表明,我们正在将具有2个参数的函数分配给名为的变量Multiply,并且这种函数作为赋值的概念在整个JavaScript中很常见。这只是一个事实,说明函数是“一流公民”,也就是说,可以像传递值一样准确地传递它们。
所以现在到分配的区别:
var operator = 3;
var operand = 4;
var ret = Multiply(operator, operand);
在定义ret变量时,Multiply将执行并分配返回值- ret等于12。
让我们以另一种方式再次尝试:
var operator = 3;
var operand = 4;
var ret = Multiply;
现在,在定义时ret,ret成为您的Multiply功能,而不是从您的Multiply功能获得的结果。调用ret()将导致您的Multiply函数被执行,您可以完全像调用该函数一样调用它Multiply(operator, operand):
var out = ret(3, 4);
是相同的
var out = Multiply(3, 4);
您实际上已经说过,您将ret用作的代表Multiply()。在调用时ret,我们实际上是在指该Multiply函数。
回到您的window.onload。认为是:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
initAll = function() {
return 12;
}
正如您所看到的,window.onload该函数与其他任何函数一样,没有什么特别的。您可以给它分配一个值,给它分配一个函数,如果需要,可以将其为空-关键是没有什么window.onload比您自己的函数更特别了。唯一略有不同的是,它在加载时由窗口调用。[免责声明:我从未真正取消过窗口函数,因此我不确定这是否会带来负面影响。希望他们在调用函数之前检查是否已分配了一个函数,即if (window.onload) window.onload();]。
现在initAll(),我们要说的是:
window.onload = initAll();
最好这样说:
window.onload = 12;
但是,当我们说不initAll带括号时,我们真正要说的是:我想用新函数替换我的window.onload函数,即我想用我的initAll函数替换它,以便任何调用都能window.onload运行initAll码。
所以:
window.onload = function() {
//Doing what all good window.onload functions should do...
}
替换为:
window.onload = function() {
return 12;
}
因此,任何对的调用都window.onload将执行您的initAll函数,而不是window.onload原来执行的函数。您已用新功能替换了原始功能。
实际上,您可以同样地写:
window.onload = function() {
//Write all your init code right in here instead of having a separate
//initAll function.
}
另一个可能更好地演示的示例是:
var d = new Date();
var currentTime = d.getTime();
当时d定义的时间是分配给currentTime。很好,但这仅在我们要找出包含该代码的函数什么时候被调用时(即在页面加载时)才有用。如果我们希望在任何时候currentTime调用当前时间怎么办?
var currentTime = function() {
var d = new Date();
return d.getTime();
}
var a = currentTime(); //The current time at the point a is defined...
var b = currentTime; //b is a functional reference to currentTime...
var c = b(); //The current time when variable c is defined
var d = c; //The current time when variable c was defined
请注意,我们如何完全调用b()我们的c和d作业currentTime()?