2013-06-01 32 views
0

看看下面的代码:JavaScript的 - 调用函数使用和不使用括号

HTML

<button id="button>click me</button> 

JS - VERSION 1

window.onload = init; 

function init() { 
    console.log('init called'); 
    var button = document.getElementById('button'); 
    button.onclick = buttonClickHandler; 
} 

function buttonClickHandler() { 
    console.log('button clicked'); 
} 

VS相同的HTML

JS - VERSION 2

window.onload = init(); 

在这两种情况下,为“init称为”出现在控制台“立即”,但在第二种情况下,它后面是一个错误,说明按钮为空。

这里有两件事。 1)在版本1中,它等待DOM在版本2中加载2),它发生在DOM加载之前,或者看起来如此。

我的问题。请尽可能清楚地说明版本1中发生了什么,以及版本2中发生了什么。什么是window.onload = initwindow.onload = init()是什么?另请说明每个版本的行为。为什么1会等待,但2不会?

脚本需要放在按钮元素之前,例如在头部:http://jsfiddle.net/XMEjr/1/

回答

9

版本1集合init功能是在window.onload事件上调用的函数。该函数不在该行上调用;它只是被分配(作为一个值)给一个属性。

版本2设置结果init函数是在window.onload事件上调用的函数。这与()的不同之处在于。

显然init函数被调用之前onload被触发(得到该结果并将其设置为onload处理程序)。所以函数启动,找不到元素button id(因为DOM还没有准备好),所以getElementById返回null。然后试图访问的nullonclick财产有错误停止。

+1

thx。我很有趣,如何写骨干和角码,但甚至不知道这一点。有些人可能会说可怕的,但我继续,并始终写清楚可重复使用的代码。不过,我认为这种基本的理解能够帮助很多事情在许多情况下都能实现。 – dewd

+0

另外,我只是读了一些地方,当使用window.onload = init()会工作,如果init()返回一个函数,例如runInit()。然后runInit()会在DOM加载后运行。在询问之前,我真的需要更好的谷歌搜索,但是您一直在帮助很大。谢谢。 – dewd

+0

不客气。 )是的,你可以运行一个返回函数的特定函数;毕竟,这是一种价值。 – raina77ow

0
在您指定给为onload调用的结果,第二个给init :)

如果你这样做是等价的:

window.onload="init()" 

在这种情况下会分配一个字符串,在DOM准备就绪后进行评估。

如果你

window.onload=init 

您要指派给一个函数的引用。话又说回来,当DOM准备就绪后,该函数被调用

但是,如果你这样做:

window.onload=init() 

你可以做

function init() { alert ("this is called before onload, dom is not ready, button doesnt exist"); return init2; } 

function init2() { alert ("this is called on load, dom is ready, button and everything in the body is now created"); } 

希望你明白了吧。

顺便说一句,这种情况下会做这样的事情是有用的:

window.onload=init() 

function init() { 
    if (IS_IPHONE) return init_iphone; 
    if (IS_ANDROID) return init_android; 
    if (IS_WINDOWS) return init_not_supported; 
} 

所以你选择哪一个init方法来执行的onload。