Duplicar posible:
How does the (function() {})() construct work and why do people use it?Por qué usar (function() {....}());
¿Por qué los archivos de JavaScript modernos utilizan construcciones como:
(function() {
// some real code
}());
es decir, Entiendo que se está creando una función anónima y luego se la llamó de inmediato, sin que se hayan pasado parámetros ... Pero ¿por qué hacerlo de esta manera y no solo llamar al some real code
? ¿Y para qué sirve el par de corchetes?
En particular, estoy mirando el archivo js/start.js en Github:
(function() {
"use strict";
wooga.castle.GRID_UNIT = 48;
wooga.castle.IMAGES_BASE_URL = "images/entities/";
(function() {
var style = document.createElement('div').style,
prefix;
var candidates = {
webkit: 'webkitTransform',
moz: 'MozTransform', // 'M' is uppercased
ms: 'msTransform',
o: 'oTransform',
'': 'transform'
};
for (var prefix in candidates) {
var candidate = candidates[prefix];
if ('undefined' !== typeof style[candidate]) {
wooga.castle.prefix = prefix;
wooga.castle.prefixedTransform = candidate;
break;
}
}
}());
// XXX why the 2 wrapped "function"s here? XXX
wooga.castle.isNativeWrapper = function() {
var result = !wooga.castle.capabilities.desktop && !wooga.castle.capabilities.android && (! /Safari/.test(navigator.userAgent));
wooga.castle.isNativeWrapper = function() {
return result;
};
return result;
};
}());
Con mis conocimientos básicos de JavaScript y jQuery entiendo los comandos individuales enumerados anteriormente, pero que no entiendo por qué están envueltos en el interior de varios function
s. No podemos llamar:
"use strict";
wooga.castle.GRID_UNIT = 48;
wooga.castle.IMAGES_BASE_URL = "images/entities/";
var style = document.createElement('div').style,
prefix;
var candidates = {
webkit: 'webkitTransform',
moz: 'MozTransform', // 'M' is uppercased
ms: 'msTransform',
o: 'oTransform',
'': 'transform'
};
for (var prefix in candidates) {
var candidate = candidates[prefix];
if ('undefined' !== typeof style[candidate]) {
wooga.castle.prefix = prefix;
wooga.castle.prefixedTransform = candidate;
break;
}
}
wooga.castle.isNativeWrapper = !wooga.castle.capabilities.desktop && !wooga.castle.capabilities.android && (! /Safari/.test(navigator.userAgent));
He visto '((función() {})())' pero no '(función() {}())'. – kevin628
@ kevin628: Nunca he visto '((función() {})())'. Eso es demasiados '()' s. La otra forma es: '(function() {})()' –
@Rocket Parece que son lo mismo, al menos en Chrome. Uno solo tiene menos '()' s. Aprendí algo nuevo hoy. – kevin628