mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-09 10:27:49 +00:00
Remove script injection and simplify createFunction.
Former-commit-id: cc466c8ea05210b2238ee72a624628c7454eb1ee
This commit is contained in:
66
lodash.js
66
lodash.js
@@ -16,16 +16,6 @@
|
|||||||
window = freeGlobal;
|
window = freeGlobal;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* The `document` object used by `createFunction`:
|
|
||||||
*
|
|
||||||
* The JS engine embedded in Adobe products, like InDesign, will throw an
|
|
||||||
* error when acessing `window.document`.
|
|
||||||
*/
|
|
||||||
try {
|
|
||||||
var document = window.document;
|
|
||||||
} catch(e) { }
|
|
||||||
|
|
||||||
/** Used for array and object method references */
|
/** Used for array and object method references */
|
||||||
var arrayRef = [],
|
var arrayRef = [],
|
||||||
// avoid a Closure Compiler bug by creatively creating an object
|
// avoid a Closure Compiler bug by creatively creating an object
|
||||||
@@ -125,6 +115,17 @@
|
|||||||
regexpClass = '[object RegExp]',
|
regexpClass = '[object RegExp]',
|
||||||
stringClass = '[object String]';
|
stringClass = '[object String]';
|
||||||
|
|
||||||
|
/** Detect various environments */
|
||||||
|
var isFirefox = !/1/.test(function(){1}),
|
||||||
|
isIeOpera = !!window.attachEvent,
|
||||||
|
isV8 = nativeBind && !/\n|true/.test(nativeBind + isIeOpera);
|
||||||
|
|
||||||
|
/* Detect if `Function#bind` exists and is inferred to be fast (all but V8) */
|
||||||
|
var isBindFast = !isV8;
|
||||||
|
|
||||||
|
/* Detect if `Object.keys` exists and is inferred to be fast (IE, Opera, V8) */
|
||||||
|
var isKeysFast = isIeOpera || isV8;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detect the JScript [[DontEnum]] bug:
|
* Detect the JScript [[DontEnum]] bug:
|
||||||
*
|
*
|
||||||
@@ -180,15 +181,9 @@
|
|||||||
* a string without a `toString` property value of `typeof` "function".
|
* a string without a `toString` property value of `typeof` "function".
|
||||||
*/
|
*/
|
||||||
try {
|
try {
|
||||||
var noNodeClass = ({ 'toString': 0 } + '', toString.call(document || 0) == objectClass);
|
var noNodeClass = ({ 'toString': 0 } + '', toString.call(document) == objectClass);
|
||||||
} catch(e) { }
|
} catch(e) { }
|
||||||
|
|
||||||
/* Detect if `Function#bind` exists and is inferred to be fast (all but V8) */
|
|
||||||
var isBindFast = nativeBind && /\n|Opera/.test(nativeBind + toString.call(window.opera));
|
|
||||||
|
|
||||||
/* Detect if `Object.keys` exists and is inferred to be fast (IE, Opera, V8) */
|
|
||||||
var isKeysFast = nativeKeys && /^.+$|true/.test(nativeKeys + !!window.attachEvent);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Detect if sourceURL syntax is usable without erroring:
|
* Detect if sourceURL syntax is usable without erroring:
|
||||||
*
|
*
|
||||||
@@ -203,7 +198,7 @@
|
|||||||
* http://msdn.microsoft.com/en-us/library/121hztk3(v=vs.94).aspx
|
* http://msdn.microsoft.com/en-us/library/121hztk3(v=vs.94).aspx
|
||||||
*/
|
*/
|
||||||
try {
|
try {
|
||||||
var useSourceURL = (Function('//@')(), !window.attachEvent);
|
var useSourceURL = (Function('//@')(), !isIeOpera);
|
||||||
} catch(e) { }
|
} catch(e) { }
|
||||||
|
|
||||||
/** Used to identify object classifications that `_.clone` supports */
|
/** Used to identify object classifications that `_.clone` supports */
|
||||||
@@ -326,38 +321,13 @@
|
|||||||
* @param {String} body The function body.
|
* @param {String} body The function body.
|
||||||
* @returns {Function} The new function.
|
* @returns {Function} The new function.
|
||||||
*/
|
*/
|
||||||
var createFunction = function(args, body) {
|
function createFunction(args, body) {
|
||||||
var error,
|
|
||||||
onerror = window.onerror,
|
|
||||||
prevDash = window._,
|
|
||||||
script = document.createElement('script'),
|
|
||||||
sibling = document.scripts[0];
|
|
||||||
|
|
||||||
// use script injection to avoid Firefox's unoptimized `Function` constructor
|
|
||||||
// http://bugzil.la/804933
|
|
||||||
window.onerror = function(message) {
|
|
||||||
error = message;
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
// the newline, in `'\n}'`, is required to avoid errors if `body` ends
|
// the newline, in `'\n}'`, is required to avoid errors if `body` ends
|
||||||
// with a single line comment
|
// with a single line comment
|
||||||
script.text = 'var _ = function(' + args + ') {' + body + '\n}';
|
return window.eval('(function(' + args + ') {' + body + '\n})');
|
||||||
sibling.parentNode.insertBefore(script, sibling).parentNode.removeChild(script);
|
}
|
||||||
|
// use script injection if Firefox's script engine is detected
|
||||||
var result = window._;
|
if (isIeOpera || isV8 || !isFirefox) {
|
||||||
window._ = prevDash;
|
|
||||||
window.onerror = onerror;
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
throw new SyntaxError(error);
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
try {
|
|
||||||
// use script injection if Firefox's script engine is detected
|
|
||||||
(/1/.test(function(){1}) || createFunction)();
|
|
||||||
} catch(e) {
|
|
||||||
createFunction = Function;
|
createFunction = Function;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user