在页面加载时候要执行一个函数,是用匿名自调用写好呢,还是传统的onload方法好?
我想着既然只执行一次,用匿名自调用函数,执行完就可以回收空间了。会不会更好一些?
但是为什么很少有人这么写呢?是我的观点错了吗?<script>
(function(){
alert("");
})();window.onload = function(){
alert("");
}
</script>这两样写法分别有什么优缺点?我的理解还不是很深,所以自己怕想错了。JavaScript函数匿名自调用
我想着既然只执行一次,用匿名自调用函数,执行完就可以回收空间了。会不会更好一些?
但是为什么很少有人这么写呢?是我的观点错了吗?<script>
(function(){
alert("");
})();window.onload = function(){
alert("");
}
</script>这两样写法分别有什么优缺点?我的理解还不是很深,所以自己怕想错了。JavaScript函数匿名自调用
发生的先后顺序是:自执行函数>DOMContentLoaded>load
html的解析是从上而下的。例如你在<head>写了一个自执行函数,函数内容是一个死循环。那么打开页面,什么都不会显示。因为浏览器一直在执行这个函数,body的元素根本就没被解析。
javascript要操作页面内的元素,load和DOMContentLoaded的意义在于它们标志着文档已经加载好了,页面内的元素可以使用了。
(functin(){})() 马上执行
onload = functin(){} 主要指body代码绘制完成后 执行
document.readyState = "complete" 所有的代码待命后再执行
那当然是(function (){})()效率更高
你写的两种方式效果本就不同
写在页面底部加快速度是可以的,但有时你未必能够写的到底部去,比如一个头部,多个页面都需要引入,但其中的公用js需要访问页面内容,这时条件限制该段js就只能加载在前面,你就只能通过事件函数保证js在页面加载完再执行了
1.onload 是一个事件 表示在一定的顺序下才会触发 而另外一个则 js执行到了就触发
2.上手不用考虑 内存回收空间之类的 一张图片就超过了你 所有的代码空间
1.onload 是一个事件 表示在一定的顺序下才会触发 而另外一个则 js执行到了就触发
2.上手不用考虑 内存回收空间之类的 一张图片就超过了你 所有的代码空间
那我把JS代码放在</html>后面呢,要是这样的话,操作dom也可以了吧?而且是不是效率更高,占用的资源更小呢?前辈们。
那当然是(function (){})()效率更高谢谢几位前辈。
1.onload 是一个事件 表示在一定的顺序下才会触发 而另外一个则 js执行到了就触发
2.上手不用考虑 内存回收空间之类的 一张图片就超过了你 所有的代码空间
那我把JS代码放在</html>后面呢,要是这样的话,操作dom也可以了吧?而且是不是效率更高,占用的资源更小呢?前辈们。
那当然是(function (){})()效率更高谢谢几位前辈。不客气
除非你onload加载的函数里有特殊引用,不然不是一执行完就回收变量回收内存什么的。。
这在效率上有什么问题。。
对哦……最开始想到这个问题的时候是在body 里面加一个onload属性,所以有回收不回收,提问时候改了下就忘了……。那么二者的执行效率有差别吗? 假如都能正确执行的话。
对哦……最开始想到这个问题的时候是在body 里面加一个onload属性,所以有回收不回收,提问时候改了下就忘了……。那么二者的执行效率有差别吗? 假如都能正确执行的话。
你说的在body里面加一个onload属性是这样吗?<body onload="foo()">
<script>
function foo() {
//Do something
}
</script>
</body>感觉即使是这样,也不存在内存回收的问题。
首先函数只有执行的时候,才会加载代码段到内存,执行完了以后函数本身是不在内存里的。
然后函数局部变量回收的话,只要你不是在其他地方引用了那些变量(比如闭包),那么函数退出后,变量就会被回收的,不管你是匿名函数也好,普通函数也好。
最后关于回收的问题,其实不同浏览器,不同的实现,回收机制都不是完全一样的,并不是函数一退出,浏览器就去进行垃圾回收,而是有个触发条件的,比如每隔多长时间回收一次,或者当内存占用达到多少回收一次,所以即便函数退出后,里面的局部变量等已经无用了,浏览器也不会马上去回收那些内存,所以你不要老是纠结什么回收不回收的。当然你硬是要问哪个效率高些,那个人意见觉得匿名函数肯定还是效率“高”一些。
因为匿名函数没有名字,你不用也不能在其他地方调用它,所以JS解释器就不需要为匿名函数建立一个引索,而普通函数的话,起码函数名是要永驻内存的,因为代码执行的时候要是碰到函数调用,解释器是要去找这个函数的位置并调用的,所以还是会消耗一点资源。但个人绝对这点资源真的是很少很少了,真的随便一个图片就抵你几百个几千个函数了,你纠结什么效率问题啊。。