Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit 1e8698b

Browse files
committed
perf(jqLite): refactor jqLiteExpandoStore to minimize access to expensive element.ng339 expando property
1 parent 503dcb0 commit 1e8698b

File tree

1 file changed

+29
-29
lines changed

1 file changed

+29
-29
lines changed

src/jqLite.js

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -318,44 +318,41 @@ function jqLiteRemoveData(element, name) {
318318
}
319319
}
320320

321-
function jqLiteExpandoStore(element, key, value) {
321+
322+
function jqLiteExpandoStore(element, createIfNecessary) {
322323
var expandoId = element.ng339,
323324
expandoStore = expandoId && jqCache[expandoId];
324325

325-
if (isDefined(value)) {
326-
if (!expandoStore) {
327-
element.ng339 = expandoId = jqNextId();
328-
expandoStore = jqCache[expandoId] = {};
329-
}
330-
expandoStore[key] = value;
331-
} else {
332-
return key ? expandoStore && expandoStore[key] : expandoStore;
326+
if (createIfNecessary && !expandoStore) {
327+
element.ng339 = expandoId = jqNextId();
328+
expandoStore = jqCache[expandoId] = {events: {}, data: {}, handle: undefined};
333329
}
330+
331+
return expandoStore;
334332
}
335333

334+
336335
function jqLiteData(element, key, value) {
337336
if (jqLiteAcceptsData(element)) {
338-
var data = jqLiteExpandoStore(element, 'data'),
339-
isSetter = isDefined(value),
340-
keyDefined = !isSetter && isDefined(key),
341-
isSimpleGetter = keyDefined && !isObject(key);
342337

343-
if (!data && !isSimpleGetter) {
344-
jqLiteExpandoStore(element, 'data', data = {});
345-
}
338+
var isSimpleSetter = isDefined(value);
339+
var isSimpleGetter = !isSimpleSetter && key && !isObject(key);
340+
var massGetter = !key;
341+
var expandoStore = jqLiteExpandoStore(element, !isSimpleGetter);
342+
var data = expandoStore && expandoStore.data;
346343

347-
if (isSetter) {
344+
if (isSimpleSetter) { // data('key', value)
348345
data[key] = value;
349346
} else {
350-
if (keyDefined) {
351-
if (isSimpleGetter) {
352-
// don't create data in this case.
347+
if (massGetter) { // data()
348+
return data;
349+
} else {
350+
if (isSimpleGetter) { // data('key')
351+
// don't force creation of expandoStore if it doesn't exist yet
353352
return data && data[key];
354-
} else {
353+
} else { // mass-setter: data({key1: val1, key2: val2})
355354
extend(data, key);
356355
}
357-
} else {
358-
return data;
359356
}
360357
}
361358
}
@@ -727,12 +724,13 @@ forEach({
727724
return;
728725
}
729726

730-
var expandoStore = jqLiteExpandoStore(element);
731-
var events = expandoStore && expandoStore.events;
732-
var handle = expandoStore && expandoStore.handle;
727+
var expandoStore = jqLiteExpandoStore(element, true);
728+
var events = expandoStore.events;
729+
var handle = expandoStore.handle;
733730

734-
if (!events) jqLiteExpandoStore(element, 'events', events = {});
735-
if (!handle) jqLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events));
731+
if (!handle) {
732+
handle = expandoStore.handle = createEventHandler(element, events);
733+
}
736734

737735
// http://jsperf.com/string-indexof-vs-split
738736
var types = type.indexOf(' ') ? type.split(' ') : [type];
@@ -896,7 +894,9 @@ forEach({
896894

897895
var dummyEvent, eventFnsCopy, handlerArgs;
898896
var eventName = event.type || event;
899-
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];
897+
var expandoStore = jqLiteExpandoStore(element);
898+
var events = expandoStore && expandoStore.events;
899+
var eventFns = events && events[eventName];
900900

901901
if (eventFns) {
902902

0 commit comments

Comments
 (0)