Este artículo describe las técnicas previas al par de JavaScript y las relacionadas. Compártelo para su referencia, como sigue:
variable
Nuevamente, comience con las indicaciones de comparación de errores de estos dos pequeños ejemplos.
alerta (y1); // segmento de código 1var y1 = 'dddd'; alerta (y2); // segmento de código 2 // alerta (typeof y2); y2 = 'xxxxx';
Primero pensemos por qué se indica indefinido, y el otro arroja el error de las variables indefinidas. . Primero veamos el proceso de análisis de JavaScript.
Antes del proceso de ejecución, JavaScript hará un evento "Preparación". El motor de análisis realiza la creación de todas las variables VAR en el nivel de bloque y les da un valor inicial: indefinido. De esta manera, la razón por la cual el primer ejemplo aparece indefinido es obvia.
Entonces, el primer código es realmente equivalente a
var y1; alerta (typeof y1); // Naturalmente, su valor es indefinido1 = 'dddd';
¿Por qué la segunda pieza de código volvió a arrojar mal? Ya no pertenece a la etapa "pre-parada" (aquí supongo que el navegador solo hace dos cosas al encontrar una etiqueta de script: pre-parse y ejecución, que en realidad no es solo estas dos cosas). Sin embargo, en la etapa de ejecución, la razón para lanzar el error es que JS no conoce el estado de Y2 en el estado del segmento de ejecución (no se capturó información de Y2 en la etapa previa al parto) y, por supuesto, arroja información de error indefinida. Otro problema está involucrado aquí: JS es un lenguaje de tipo débil, y las variables se pueden usar sin definición, entonces, ¿por qué se arroja aquí como un error de definición?
Siempre hay una razón para que las cosas sucedan. JavaScript siempre tiene muchas características extrañas, y hay una variable que se lee y escribe desigual. Las variables indefinidas solo son escritas y no son legibles. ¿Qué se puede escribir? Todos están familiarizados con este método de escritura:
y2 = 'examen'; // Antes de que aparezca su operación de definición (es decir, antes de que no tenga su propio alcance), esta operación considerará este código para definir una variable global, registrar una propiedad Y2 en la ventana y asignarla al examen
Pero al leerlo, el motor JS no puede encontrar ninguna información relacionada al respecto, por lo que actúa con su propio temperamento y comete un error indefinido sin dudarlo. Esta es la regla del juego de JS. Y sin embargo, ¿por qué puedes obtener su tipo? Recuerde las operaciones de JS en objetos. Si accede a un objeto que no existe, provocará indefinido (porque actualmente es un atributo del objeto de la ventana).
Nota: Es necesario distinguir aquí que las variables desiguales de lectura y escritura solo se usan para variables, y todas las propiedades de los objetos se leen. Esta característica no existe. Si no existe, provocará indefinido.
en conclusión
En este punto, mis pensamientos dan como resultado: hay ciertas similitudes en las operaciones de escritura de variables y objetos. Sin embargo, cada uno tiene su propio conjunto de reglas para las operaciones de lectura. Debido a esto, se encuentran los problemas anteriores.
De esta manera, la siguiente pregunta debe responderse fácilmente.
if (! ('a' en la ventana)) {var a = 1;} alert (a);función
Para extenderlo, función. Recuerde el pre-parto mencionado anteriormente. En el prepacio de JavaScript, además de la pre-definición de las variables VAR, también incluye extraer la definición de la función, por lo que la función se puede definir en cualquier parte del script y llamar a cualquier lugar. No limitado a antes.
Sin embargo, el método de definición de función incluye un método de definición literal, utilizando el método de VAR para declarar la función. Vea abajo
alerta (typeOf y3); // resultado? Var y3 = function () {console.log ('1'); }Recuerde este acuerdo: la llamada debe aparecer después de la declaración. ¿Por qué? Si comprende lo anterior, la respuesta aquí es realmente clara. Al preparar VAR, el motor JavaScript les dará un valor inicial indefinido. De esta manera, si lo llamamos antes de su declaración, el motor JavaScript aún no ha obtenido su verdadero valor, naturalmente informará el error de "xxx no es una función". Esto también aclara por qué ambas declaraciones de funciones están relacionadas con el orden de declaraciones y llamadas, y la otra no tiene tales restricciones.
en conclusión
Es una función, el resultado de la ejecución de JS y la modificación dinámica, y aún sigue las reglas de variables previas al análisis (al alertar anteriormente, no obtuvo la información de la función literal).
¿Qué pasa si es una mezcla de dos? Mire lo siguiente, hay variables y funciones para Y4.
alerta (typeOf y4); // resultado? Function y4 () {console.log ('y4')} var y4;Debido a que JavaScript tiene una alta prioridad en el pre-parcial, Y4 es naturalmente un tipo de función, pero después de que se asigne Y4 (el motor JS está en proceso de ejecución), su operación de asignación a JS anulará la declaración de función. entonces:
alerta (typeof y5); var y5 = 'ángulo'; function y5 () {console.log ('fantasma'); } alerta (y5);El primer resultado de alerta es la función porque está en la parte superior del proceso de ejecución JS. La segunda vez que se renombra la alerta, su valor se ha reescrito a 5 (no se confunda con la posición de definición de la función a continuación).
Pensando en el análisis y la ejecución de JS, me di cuenta de que de repente me di cuenta de que las respuestas a muchas preguntas surgieron naturalmente. Como dijo el autor de ese artículo: "Una vez que comprenda los conceptos de entorno de ejecución, llame a objetos, cierres, alcance léxico y cadenas de alcance, muchos fenómenos en el lenguaje JS se pueden resolver fácilmente".
Mirando hacia atrás ahora, incluso en este increíble lenguaje, hay muchas razones que se remontan a él.
Cómo hacer mejores juicios de parámetros
Después de discutir tanto, ¿cómo puede estar más cerca del desarrollo real? Dado que JavaScript lea y escribe desigualdad, ¿cómo podemos evitar hacer juicios de parámetros sin errores de informes?
p.ej:
if (cusvar) {// El juicio aquí es un problema implícito. }Cómo ser más riguroso.
if (window ['cusvar']) {// Asegúrese de que no informe un error. // o tal juicio también es factible Window.cusvar | typeof cusvar! == 'Undefined' // Work}Finalmente, se agrega otro pequeño cuestionario (comprende la separación de pre-parcial y ejecución)
var y7 = 'test'; function divers1 () {alert (y7); var y7 = 'sex';} fun1 ();For more information about JavaScript related content, please check out the topics of this site: "Summary of JavaScript switching effects and techniques", "Summary of JavaScript search algorithm skills", "Summary of JavaScript animation effects and techniques", "Summary of JavaScript errors and debugging techniques", "Summary of JavaScript data structures and algorithm skills", "Summary of JavaScript Algoritmos y técnicas de recorrido ", y" Resumen del uso de operaciones matemáticas de JavaScript "
Espero que este artículo sea útil para la programación de JavaScript de todos.