在页面加载时候要执行一个函数,是用匿名自调用写好呢,还是传统的onload方法好?
我想着既然只执行一次,用匿名自调用函数,执行完就可以回收空间了。会不会更好一些?
但是为什么很少有人这么写呢?是我的观点错了吗?<script>
(function(){
   alert("");
})();window.onload = function(){
  alert("");
}
</script>这两样写法分别有什么优缺点?我的理解还不是很深,所以自己怕想错了。JavaScript函数匿名自调用

解决方案 »

  1.   

    自执行函数在解析javascript的时候执行。window的load事件发生在页面元素全部加载之后(包括图片)发生。还有个DOMContentLoaded事件,这个事件发生在文档加载之后(不包括图片)。
    发生的先后顺序是:自执行函数>DOMContentLoaded>load
    html的解析是从上而下的。例如你在<head>写了一个自执行函数,函数内容是一个死循环。那么打开页面,什么都不会显示。因为浏览器一直在执行这个函数,body的元素根本就没被解析。
    javascript要操作页面内的元素,load和DOMContentLoaded的意义在于它们标志着文档已经加载好了,页面内的元素可以使用了。
      

  2.   

    那我把JS代码放在</html>后面呢,要是这样的话,操作dom也可以了吧?而且是不是效率更高,占用的资源更小呢?前辈们。
      

  3.   

    匿名函数放在文档的任何地方都是按照文档从上到下的顺序来执行的,window.onload的函数是指文档都加载完成的情况下才执行的,包括图片,和其他的,匿名函数真正用的多的就是自己写的一个类库或自己的一个函数方法,类似于jquery那样,(function(){...})(jQuery);
      

  4.   

    JS执行的顺序:
    (functin(){})()  马上执行
    onload = functin(){} 主要指body代码绘制完成后 执行
    document.readyState = "complete" 所有的代码待命后再执行
      

  5.   

    那我把JS代码放在</html>后面呢,要是这样的话,操作dom也可以了吧?而且是不是效率更高,占用的资源更小呢?前辈们。
    那当然是(function (){})()效率更高
      

  6.   

    和观点没什么关系,
    你写的两种方式效果本就不同
    写在页面底部加快速度是可以的,但有时你未必能够写的到底部去,比如一个头部,多个页面都需要引入,但其中的公用js需要访问页面内容,这时条件限制该段js就只能加载在前面,你就只能通过事件函数保证js在页面加载完再执行了
      

  7.   


    1.onload 是一个事件 表示在一定的顺序下才会触发 而另外一个则 js执行到了就触发
    2.上手不用考虑 内存回收空间之类的 一张图片就超过了你 所有的代码空间
      

  8.   


    1.onload 是一个事件 表示在一定的顺序下才会触发 而另外一个则 js执行到了就触发
    2.上手不用考虑 内存回收空间之类的 一张图片就超过了你 所有的代码空间
    那我把JS代码放在</html>后面呢,要是这样的话,操作dom也可以了吧?而且是不是效率更高,占用的资源更小呢?前辈们。
    那当然是(function (){})()效率更高谢谢几位前辈。
      

  9.   


    1.onload 是一个事件 表示在一定的顺序下才会触发 而另外一个则 js执行到了就触发
    2.上手不用考虑 内存回收空间之类的 一张图片就超过了你 所有的代码空间
    那我把JS代码放在</html>后面呢,要是这样的话,操作dom也可以了吧?而且是不是效率更高,占用的资源更小呢?前辈们。
    那当然是(function (){})()效率更高谢谢几位前辈。不客气
      

  10.   

    这有什么回收不回收的。。
    除非你onload加载的函数里有特殊引用,不然不是一执行完就回收变量回收内存什么的。。
    这在效率上有什么问题。。
      

  11.   


    对哦……最开始想到这个问题的时候是在body 里面加一个onload属性,所以有回收不回收,提问时候改了下就忘了……。那么二者的执行效率有差别吗?  假如都能正确执行的话。
      

  12.   


    对哦……最开始想到这个问题的时候是在body 里面加一个onload属性,所以有回收不回收,提问时候改了下就忘了……。那么二者的执行效率有差别吗?  假如都能正确执行的话。
    你说的在body里面加一个onload属性是这样吗?<body onload="foo()">
    <script>
      function foo() {
        //Do something
      }
    </script>
    </body>感觉即使是这样,也不存在内存回收的问题。
    首先函数只有执行的时候,才会加载代码段到内存,执行完了以后函数本身是不在内存里的。
    然后函数局部变量回收的话,只要你不是在其他地方引用了那些变量(比如闭包),那么函数退出后,变量就会被回收的,不管你是匿名函数也好,普通函数也好。
    最后关于回收的问题,其实不同浏览器,不同的实现,回收机制都不是完全一样的,并不是函数一退出,浏览器就去进行垃圾回收,而是有个触发条件的,比如每隔多长时间回收一次,或者当内存占用达到多少回收一次,所以即便函数退出后,里面的局部变量等已经无用了,浏览器也不会马上去回收那些内存,所以你不要老是纠结什么回收不回收的。当然你硬是要问哪个效率高些,那个人意见觉得匿名函数肯定还是效率“高”一些。
    因为匿名函数没有名字,你不用也不能在其他地方调用它,所以JS解释器就不需要为匿名函数建立一个引索,而普通函数的话,起码函数名是要永驻内存的,因为代码执行的时候要是碰到函数调用,解释器是要去找这个函数的位置并调用的,所以还是会消耗一点资源。但个人绝对这点资源真的是很少很少了,真的随便一个图片就抵你几百个几千个函数了,你纠结什么效率问题啊。。