当您在元素上存储数据时,jQuery 会将此属性添加到元素中。由于此属性位于window
元素上,因此在您的代码中某处您正在执行的操作相当于:
$(window).data('something', 1);
请注意,jQuery 事件也在data
幕后使用模块,因此这也可能是因为您正在向window
对象添加事件。
对于普通节点(即具有nodeType
属性的元素),此值设置为 GUID (data.js#61),并且您要存储在该对象上的数据存储在全局 jQuery 缓存中。
但是该window
元素没有nodeType
属性,所以它沿着I'm a plain JS object的路线走;这导致数据直接存储在对象本身上(在 的情况下window
,这可能是 jQuery 的错误)。
缓存位置(全局或对象上)的选择在data.js 的 L39-45 中进行:
// We have to handle DOM nodes and JS objects differently because IE6-7
// can't GC object references properly across the DOM-JS boundary
isNode = elem.nodeType,
// Only DOM nodes need the global jQuery cache; JS object data is
// attached directly to the object so GC can occur automatically
cache = isNode ? jQuery.cache : elem,
在普通 DOM 元素的情况下,该值在data.js#61中分配了一个 GUID :
elem[ internalKey ] = id = jQuery.deletedIds.pop() || jQuery.guid++;
但是对于普通的 JS 对象(window
在这种情况下),该对象是在68 - 74中构建的:
cache[id] = {};
// Avoids exposing jQuery metadata on plain JS objects when the object
// is serialized using JSON.stringify
if (!isNode) {
cache[id].toJSON = jQuery.noop;
}
奇怪的值是jQuery.expando
,它在data.js#14中定义,并初始化为:
"jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" )
(基本上是“jQuery”,然后是删除了“.”的 jQuery 版本(在您的情况下为 1800),然后是一个随机数)。