0

我了解将函数指针传递给事件处理程序时,您不能使用括号调用功能块,否则该函数的返回值将分配给事件处理程序。我试过这个,我对它是如何工作的感到困惑?

window.onload = alert("Hello, World.");

我可以看到这是如何工作的......

window.onload = function () { alert("Hello, World!"); };

文字函数不会自调用导致没有返回值,并且仅在调用 onclick 事件后才调用。

编辑1:我不想用这个实现任何目标。我只是想了解 window.onload = alert("Hello, World."); 完美运行以及如何 window.onload = show_message("Hello, World."); 不起作用?...考虑到 show_message 实际上是一个函数。

编辑 2:一些用户声称 onload 事件处理程序可以在任何函数上使用括号。我认为这不会像它应该的那样工作,因为调用该函数时忽略了事件处理程序,并且该函数的返回值被分配给了事件处理程序。大多数函数不返回任何内容,因此(未定义或 null)将分配给事件处理程序。

看看下面的代码。

var button = document.getElementById("button");

function test() {
    str = "works";
    console.log(str);
}

button.onclick = test;​

假设有一个按钮元素,其按钮的 id 分配给它。这仅在未使用括号调用测试 (button.onclick = test();) 时才有效。测试只会运行一次,undefined 将被分配给 onclick。

编辑 3:如果调用函数,看起来返回值没有分配给事件处理程序。当我使用 console.log 时,它总是将 null 写入控制台。

4

2 回答 2

2

好问题。实际上它并没有像你期望的那样工作。它只是以这种方式工作的错觉。当你运行时:

window.onload = alert("Hello, World.");

语句的右侧部分被执行并显示警报,但加载处理程序的窗口未设置为某些功能,null将分配给它,因为这是警报返回的内容。

顺便说一句,即使您使用括号调用该方法,您也可以从中返回函数以分配给事件处理程序:

var button = document.getElementById("button");

function test() {
    str = "works";
    console.log(str);
    return function(){console.log('button clicked');}
}

button.onclick = test();
于 2012-08-11T07:47:49.220 回答
2

window.onload = alert("Hello, World.");,您看到警报有效,只是因为它在执行时发出警报,并将结果(未定义)分配给window.onload.

于 2012-08-11T07:48:06.343 回答