jQuery1.7.2版本源码 bindReady函数中为什么要创建一个有'once memory'的回调对象?

铛铛铛铛Huan 2017-07-26 10:51:33
这两天在看jQuery源码回调对象模块,因为jQuery.ready()是基于此来实现的,所以也回顾了一下ready函数。然后一直想不明白一个问题, 在bindReady()函数中
readyList = jQuery.Callbacks( "once memory" );

创建了一个带有'once memory'标志的回调对象,在回调对象中,once是表示只能fire一次,memory是有记忆功能,也就是说后面添加的回调函数会立即触发,并且是上一次fire时所调用的参数。

但是在ready事件中,页面DOM加载完成才会触发ready,而DOM加载只会出现一次,也就是说 ready函数不会触发第二次,也自然不会fire两次,所以觉得once是没有必要的呀?

希望了解的 回应一下,真的比较困惑。
...全文
192 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
z153373846 2017-07-26
  • 打赏
  • 举报
回复
为什么要去看1.*的版本?
铛铛铛铛Huan 2017-07-26
  • 打赏
  • 举报
回复
试过了,主要是 once memory 都删了,也同样只执行一次
ddgx 2017-07-26
  • 打赏
  • 举报
回复
你可以把once 删了 测试下效果
铛铛铛铛Huan 2017-07-26
  • 打赏
  • 举报
回复
回复#2: 那也就是说: 触发了DOMContentLoaded,再触发load事件时,就不会fire了,也就是不会执行回调函数了?
铛铛铛铛Huan 2017-07-26
  • 打赏
  • 举报
回复
回复 #1: 因为是配合着高云 jQuery技术内幕来看的,所以就拿jQuery1.7.2版本来分析的
ddgx 2017-07-26
  • 打赏
  • 举报
回复

// Mozilla, Opera and webkit nightlies currently support this event
		if ( document.addEventListener ) {
			// Use the handy event callback
			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );

			// A fallback to window.onload, that will always work
			window.addEventListener( "load", jQuery.ready, false );

		// If IE event model is used
		} else if ( document.attachEvent ) {
			// ensure firing before onload,
			// maybe late but safe also for iframes
			document.attachEvent( "onreadystatechange", DOMContentLoaded );

			// A fallback to window.onload, that will always work
			window.attachEvent( "onload", jQuery.ready );

			……
		}
因为考虑到浏览器的兼容性,它绑定了DOMContentLoaded/onreadystatechange和load/onload 两个事件;

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧