javascript - attribute - title html css
Javascript anĂ³nimo de cierre (4)
La sintaxis
(function(){...})()
es simplemente una función anónima inmediatamente invocada. No importa cómo use sus corchetes, ya que el código subyacente es una función que se declara e invoca.
En cambio, los cierres se utilizan para describir una situación en la que una función tiene acceso a las variables declaradas fuera de su alcance, accesibles a través de cierres
Para mayor claridad :
Si tenemos la siguiente función
function hello() {
alert("Hello");
}
Podemos llamar a la función con la siguiente
hello()
Que invoca la función ''hola''. Pero si no deseamos darle un nombre, pero aún así lo invocamos, entonces podemos hacer
(function hello() {
alert("Hello");
})()
¿Qué hará exactamente lo mismo que el ejemplo anterior de llamar a hello
Sin embargo, en este escenario no tiene sentido darle a la función el nombre ''hola'', por lo que simplemente podemos eliminarla:
(function() {
alert("Hello");
})()
¿Cuál es la notación utilizada en su pregunta original.
He leído mucho sobre cierres en Javascript. ¿Para qué sirven esos frenos? Leí en mozilla.org que dice que el cierre debería definirse como
(function(){...})();
pero en http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html , dice que la función de cierre es
(function(){...}());
¿Cuál es la diferencia o la última está mal? ¿Cuál es el propósito del último ()? ¿Pondrías algunos parámetros dentro? Estoy buscando una buena referencia.
Edit: Además, hay un ejemplo en mozilla.org
var makeCounter = function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
}
};
¿Por qué se necesita el punto y coma para esta ''función''? Si necesita ser invocado inmediatamente después de su declaración, debe colocarse un () antes del punto y coma final. Pero no hay.
No hay diferencia. También puedes hacerlo:
true && function(){ /* code */ }();
0,function(){ /* code */ }();
!function(){ /* code */ }(); // Facebook style
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();
// with new
new function(){ /* code */ }
new function(){ /* code */ }() // if you need arguments then use brackets
Su ejemplo muestra una expresión de función invocada inmediatamente , o IIFE. Le dice al intérprete:
- Aquí hay una función
- no tiene nombre
- Manténgalo alejado del alcance global, es decir, ''ventana''
- llámalo ahora
Sí, puedes poner parámetros dentro del último (). Por ejemplo:
(
function(username){
alert("Hello " + username);
}
)("John Smith")
Closures son una característica de javascript que nos permite implementar la ocultación de datos que es aproximadamente equivalente a las variables privadas en lenguajes como C ++ o Java.
function getBmiCalculator(height, weight) {
// These are private vars
var height = height;
var weight = weight;
function calculateBmi(){
return weight / (height * height);
}
return calculateBmi;
}
var calc = getBmiCalculator(1.85, 90);
// calc still has access to the scope where height and weight live.
var bmi = calc();
alert(bmi);
En este ejemplo, la altura y el peso no pueden recogerse en la basura hasta que se destruya el calc. La sección de memoria o "alcance" donde existe la altura y el peso están "Cerradas"
el operador de agrupación puede rodear la descripción de la función como sin paréntesis de llamada, y también incluye paréntesis de llamada. Es decir, ambas expresiones de abajo son correctas FE:
(function () {})();
(function () {}());