javascript函数调用

function styleHeaderSiblings(tag, theclass) {
    if (!document.getElementsByTagName) return false;
    var headers = document.getElementsByTagName(tag);
    var elem;
    for (var i = 0; i < headers.length; i++) {
        elem = getNextElement(headers[i].nextSibling);
        addClass(elem, theclass);
    }
}
addLoadEvent(function () {//1种
    styleHeaderSiblings("h1", "intro");
});

addLoadEvent(styleHeaderSiblings("h1", "intro"));//2种

function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    } else {
        window.onload = function () {
            oldonload();
            func();
        }
    }
}

为什么不能通过第二种方法调用?

阅读 3.3k
3 个回答

第一种方式你向addLoadEvent传递了一个匿名函数作为参数,然后在addLoadEnent里面进行相应的调用。

第二种方式,当执行addLoadEvent(styleHeaderSiblings("h1", "intro"));的时候,其中styleHeaderSiblings("h1", "intro")就已经是函数调用了,由于styleHeaderSiblings没有显式return,就返回了undefined,即你实际传入到addLoadEvent是undefined。

第一个addLoadEvent的参数是匿名函数
第二个addLoadEvent的参数是函数执行后的结果(注意:这里的styleHeaderSiblings已经执行,执行后的返回值传给addLoadEvent),没有return的话就等于传入了undefined
等价于

var str = styleHeaderSiblings("h1", "intro");
addLoadEvent(str);

addLoadEvent接受的参数是一个函数,而你的第二种方式是将执行结果作为参数,此时styleHeaderSiblings并没有返回任何参数,即addLoadEvent接受的func是undefined

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题