关于addLoadEvent函数的一点小疑问

function styleHeaderSibling(tag, theclass){
    if(! document.getElementsByTagName)  return false;
    var headers = document.getElementsByTagName("h1");
    for(var i =0; i<headers.length; i++){
        var elem = getNextElement(headers[i].nextSibling);
        //elem.style.fontWeight = "bold";
        //elem.style.fontSize = "1.2em";
        //elem.className ="intro";       //有些已有className会被覆盖掉。所以写出addClass函数。
        addClass(elem, "intro");     
    }
addLoadEvent(function(){
    styleHeaderSibling("h1", "intro");
});

这个是dom编程艺术 第九章对函数进行抽象的一点内容,我想问的是能不能直接写addLoadEvent(styleHeaderSibling("h1", "intro"));进行调用。我试了下代码,是可以运行的,这里我有两点疑问:
1、addLoadEvent(func)函数的定义,func是不加括号的,用这个语句addLoadEvent(styleHeaderSibling("h1", "intro"));调用为什么还能正常运行。
2、为什么要特地弄个匿名函数出来。必要性在哪里?

阅读 2.4k
3 个回答

写法一:addLoadEvent(styleHeaderSibling("h1", "intro"))你这么写,运行的时候,styleHeaderSibling("h1", "intro")函数在这就被调用了。

写法二:addLoadEvent(function(){

styleHeaderSibling("h1", "intro");

});

是交给addLoadEvent方法里面的callback执行函数执行

通俗说应该就是,第一个写法执行完styleHeaderSibling再执行addLoadEvent
第二个写法是先执行addLoadEvent,函数体内部再执行styleHeaderSibling

论必要性,其实是看你编程时的逻辑了,各有场合

第二种写法是回调函数,传入的函数可以在主函数执行的时候随时触发,第一种写法相当于把传的函数执行完的再执行主函数

addLoadEvent(func){
    func();
};

addLoadEvent(func)func只是一个形参,没有实际意义的。

在函数addLoadEvent中,会调用func方法。

所以当你传入的是styleHeaderSibling,其实就是addLoadEvent中运行了styleHeaderSibling(),若果你传入styleHeaderSibling("h1", "intro"),就相当于运行styleHeaderSibling()()

囧,你代码没贴全吧。。
没看过dom编程艺术
首先addLoadEvent是啥?一脸懵逼。。
你没有贴addLoadEvent函数定义代码。。。

理论上你的addLoadEvent定义的时候带了参数里面执行了这个参数
两种方法都是可以的。。

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