8000 Avoid using `setImmediate` in IE because it cannot be cleared with `c… · lodash/lodash@4bc4997 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4bc4997

Browse files
committed
Avoid using setImmediate in IE because it cannot be cleared with clearTimeout.
Former-commit-id: 836d49c6440b2313f1885456645ed4a00ab82ae6
1 parent 96bac9c commit 4bc4997

File tree

9 files changed

+274
-231
lines changed

9 files changed

+274
-231
lines changed

build.js

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -472,8 +472,14 @@
472472

473473
var source = [
474474
';(function(window) {',
475-
" var freeExports = typeof exports == 'object' && exports &&",
476-
" (typeof global == 'object' && global && global == global.global && (window = global), exports);",
475+
" var freeExports = typeof exports == 'object' && exports;",
476+
'',
477+
" var freeModule = typeof module == 'object' && module && module.exports == freeExports && module;",
478+
'',
479+
" var freeGlobal = typeof global == 8000 'object' && global;",
480+
' if (freeGlobal.global === freeGlobal) {',
481+
' window = freeGlobal;',
482+
' }',
477483
'',
478484
' var templates = {},',
479485
' _ = window._;',
@@ -505,8 +511,8 @@
505511
' lodash.templates = lodash.extend(lodash.templates || {}, templates);',
506512
' });',
507513
" } else if (freeExports) {",
508-
" if (typeof module == 'object' && module && module.exports == freeExports) {",
509-
' (module.exports = templates).templates = templates;',
514+
" if (freeModule) {",
515+
' (freeModule.exports = templates).templates = templates;',
510516
' } else {',
511517
' freeExports.templates = templates;',
512518
' }',
@@ -1184,6 +1190,17 @@
11841190
.replace(/(?:\s*\/\/.*)*\n( *)if *\(hasObjectSpliceBug[\s\S]+?(?:{\s*}|\n\1})/, '');
11851191
}
11861192

1193+
/**
1194+
* Removes the `setImmediate` fork of `_.defer`.
1195+
*
1196+
* @private
1197+
* @param {String} source The source to process.
1198+
* @returns {String} Returns the modified source.
1199+
*/
1200+
function removeSetImmediate(source) {
1201+
return source.replace(/(?:\s*\/\/.*)*\n( *)if *\(isV8 *&& *freeModule[\s\S]+?\n\1}/, '');
1202+
}
1203+
11871204
/**
11881205
* Removes a given variable from `source`.
11891206
*
@@ -2110,6 +2127,8 @@
21102127
/*----------------------------------------------------------------------*/
21112128

21122129
if (isLegacy) {
2130+
source = removeSetImmediate(source);
2131+
21132132
_.each(['isBindFast', 'isV8', 'nativeBind', 'nativeIsArray', 'nativeKeys', 'reNative'], function(varName) {
21142133
source = removeVar(source, varName);
21152134
});
@@ -2119,11 +2138,6 @@
21192138
return match.replace(/(?:\s*\/\/.*)*\s*return isBindFast[^:]+:\s*/, 'return ');
21202139
});
21212140

2122-
// remove native `setImmediate` branch in `_.defer`
2123-
source = source.replace(matchFunction(source, 'defer'), function(match) {
2124-
return match.replace(/reNative.*?\|\|\s*/, '');
2125-
});
2126-
21272141
// remove native `Array.isArray` branch in `_.isArray`
21282142
source = source.replace(matchFunction(source, 'isArray'), function(match) {
21292143
return match.replace(/nativeIsArray * \|\|\s*/, '');
@@ -2296,7 +2310,7 @@
22962310
source = source.replace(/(?: *\/\/.*\n)*( *)if *\(typeof +define[\s\S]+?else /, '$1');
22972311
}
22982312
if (!isNode) {
2299-
source = source.replace(/(?: *\/\/.*\n)*( *)if *\(typeof +module[\s\S]+?else *{([\s\S]+?\n)\1}\n/, '$1$2');
2313+
source = source.replace(/(?: *\/\/.*\n)*( *)if *\(freeModule[\s\S]+?else *{([\s\S]+?\n)\1}\n/, '$1$2');
23002314
}
23012315
if (!isCommonJS) {
23022316
source = source.replace(/(?: *\/\/.*\n)*(?:( *)else *{)?\s*freeExports\.\w+ *=[\s\S]+?(?:\n\1})?\n/, '');
@@ -2380,6 +2394,7 @@
23802394
source = removeHasEnumPrototype(source);
23812395
}
23822396
if (isRemoved(source, 'createIterator', 'bind', 'keys')) {
2397+
source = removeSetImmediate(source);
23832398
source = removeVar(source, 'isBindFast');
23842399
source = removeVar(source, 'isV8');
23852400
source = removeVar(source, 'nativeBind');

dist/lodash.compat.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
/** Detect free variable `exports` */
1313
var freeExports = typeof exports == 'object' && exports;
1414

15+
/** Detect free variable `module` */
16+
var freeModule = typeof module == 'object' && module && module.exports == freeExports && module;
17+
1518
/** Detect free variable `global` and use it as `window` */
1619
var freeGlobal = typeof global == 'object' && global;
1720
if (freeGlobal.global === freeGlobal) {
@@ -4224,10 +4227,14 @@
42244227
* _.defer(function() { alert('deferred'); });
42254228
* // returns from the function before `alert` is called
42264229
*/
4227-
var defer = reNative.test(window.setImmediate) && bind(setImmediate, window) || function(func) {
4230+
function defer(func) {
42284231
var args = slice(arguments, 1);
42294232
return setTimeout(function() { func.apply(undefined, args); }, 1);
4230-
};
4233+
}
4234+
// use Node's `setImmediate`, if available
4235+
if (isV8 && freeModule && typeof setImmediate == 'function') {
4236+
defer = bind(setImmediate, window);
4237+
}
42314238

42324239
/**
42334240
* Creates a function that memoizes the result of `func`. If `resolver` is
@@ -5130,8 +5137,8 @@
51305137
// check for `exports` after `define` in case a build optimizer adds an `exports` object
51315138
else if (freeExports) {
51325139
// in Node.js or RingoJS v0.8.0+
5133-
if (typeof module == 'object' && module && module.exports == freeExports) {
5134-
(module.exports = lodash)._ = lodash;
5140+
if (freeModule) {
5141+
(freeModule.exports = lodash)._ = lodash;
51355142
}
51365143
// in Narwhal or RingoJS v0.7.0-
51375144
else {

0 commit comments

Comments
 (0)
0