2010-11-22 9 views
12

Tiene mucho sentido para mí usarlo aquí. ¿Cuál sería la alternativa? ¿Cómo puedo evitarlos en general y sobre todo por qué es malo según jsLint hacer uso de globales?¿Por qué los globales son malos?

(function($){ 
    $(function(){ 
    $body = $('body'); //this is the BAD Global 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 

¿Me puede ayudar a entender esto? Y dame una mejor solución?

Respuesta

18

Globals son malos porque no causan problemas de inmediato. Solo más tarde, después de que los haya utilizado por todas partes, causarán problemas muy desagradables, que ya no podrá resolver sin escribir su código desde cero.

Ejemplo: Utiliza $body para definir algunas funciones. Eso funciona bien Pero eventualmente, también necesitas un valor. Entonces usted usa $body.foo. Funciona bien. Luego agrega $body.bar. Y luego, semanas más tarde, necesita otro valor para agregar $body.bar.

Prueba el código y parece funcionar. Pero, de hecho, ha "agregado" la misma variable dos veces. Esto no es problema porque JavaScript no entiende el concepto de "crear una nueva variable una vez". Simplemente sabe "crear a menos que ya exista". Entonces usa su código y eventualmente, una función modificará $body.bar rompiendo otra función. Incluso encontrar el problema te llevará mucho tiempo.

Es por eso que es mejor asegurarse de que las variables solo se puedan ver según sea necesario. De esta manera, una función no puede romper a otra. Esto se vuelve más importante a medida que su código crece.

2

debe definir con var $ cuerpo, entonces sería local en el ámbito de esa función, sin var podría ser sobrescrita por todo el mundo

(function($){ 
    $(function(){ 
    var $body = $('body'); //this is the local variable 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 
+0

O sobrescribe alguna 'otra' variable global llamada $ body – Mchl

+0

sí, pero en este ejemplo reemplazaría el valor global, de esta manera solo lo oculta en el alcance de la función – mpapis

+2

Un literal de función usando variables locales que fueron declaradas en el mismo alcance que se definió la función se llama a [closure] (http://jibbering.com/faq/notes/closures/), y se debe usar extensivamente en jQuery con gran efecto. – Phrogz

2

variables de Globale podrían entrar en conflicto con otras secuencias de comandos o ser sobrescrito . Cuando no necesita un global, es aconsejable evitarlo. Sólo tiene que utilizar var (o let si su JS-Version-El apoyo es mayor que 1,7):

(function() { 
    var foo = 'bar'; 
    alert(foo); 
})(); 
2

Se podría volver a escribir que a medida que

var $body = $('body'); 

Eso (el uso de la palabra clave var) haría una variable local, que es suficiente para sus propósitos. Todavía estará dentro del alcance en su devolución de llamada each.

La razón por la que es malo usar globales es que puede sobrescribirse por cualquier otra cosa. Para que su código se escale bien, se vuelve dependiente de otros scripts que use. Es preferible mantener el script lo más autosuficiente posible, con la menor cantidad posible de dependencias apuntando al mundo exterior.

0

jsLint es muy estricto. Probablemente no sea necesario preocuparse demasiado por eso.

Pero si se siente mal, puede hacerlo al igual que cómo a cuyo ámbito jQuery:

(function($){ 
    $(function(){ 
    $.each(somearray ,(function($body){ $body.dosomething() })($('body')); 

    if (something){ 
    $('body').somethingelse(); 
    } 

    }); 
}(jQuery)); 
+3

Estoy de acuerdo en que generalmente no es necesario preocuparse por todo lo que dice jsLint, pero no lo mencionaría en este contexto, porque realmente estoy de acuerdo en que si los globales se pueden evitar sin problemas, deberían serlo, y en este codificar la variable se puede declarar como una variable local, y no se requiere ninguna otra acción. –

+0

@David Hedlund: De acuerdo – kizzx2

Cuestiones relacionadas