Primero hablemos de qué es la segmentación de palabras. La segmentación de palabras consiste en descomponer una cadena de caracteres en bloques de código que son significativos para el lenguaje de programación. Estos bloques de código se denominan tokens. Por ejemplo, el código var a = 2
se descompondrá en las siguientes unidades léxicas. Específicamente: var,a,=,2.
Nota: La segmentación de palabras consiste en dividir todo el código anterior en segmentos.
El análisis consiste en convertir el flujo de unidades léxicas en un árbol compuesto por elementos anidados nivel por nivel, que representa la estructura gramatical del programa. Este árbol se llama: árbol de sintaxis abstracta. En vista de las palabras estándar demasiado largas aquí, no las consideraremos y las mostraré directamente en una forma más intuitiva. Los detalles son los siguientes:
Análisis: el árbol de sintaxis abstracta tendrá un nodo de nivel superior var, seguido de un nodo secundario con la variable a y un nodo con el operador de asignación =. Hay otro nodo hijo de 2 debajo del símbolo de asignación. En concreto, corresponde al código var a = 2
.
El proceso de convertir un árbol de sintaxis abstracta en código ejecutable se llama generación de código. Este proceso está estrechamente relacionado con el idioma y la plataforma de destino. En pocas palabras, existe una manera de convertir el árbol de sintaxis abstracta de var a = 2
en instrucciones de máquina. Se utiliza para crear una variable llamada a y almacenar un valor en a.
dependen principalmente del motor para ejecutar código JavaScript. Cuando el motor ejecuta var a = 2, determinará si la variable a ha sido declarada buscándola. El proceso de búsqueda está asistido por ámbitos. Durante el proceso de consulta, el motor realizará LHS (consulta izquierda) para la variable a y consulta derecha para el valor. En pocas palabras, cuando la variable aparece en el lado izquierdo de la operación de asignación, se realiza una consulta LHS, y cuando aparece en el lado derecho, se realiza una consulta RHS. Para ser más precisos, la consulta LHS intenta encontrar el contenedor de la variable en sí, mientras que la consulta RHS intenta obtener su valor fuente.
Nota: En la función, habrá consultas tanto LHS como RHS. Porque en el proceso de pasar parámetros, el código realizará una asignación implícita.
Cuando la variable no ha sido declarada, el comportamiento de la consulta LHS y la consulta RHS es diferente.
función foo(a){ consola.log(a+b); b=a;}foo(2)
Nota: La primera consulta correcta en b no puede encontrar la variable, lo que significa que es una variable no declarada porque no se puede encontrar en ningún ámbito relevante. Si RHS no puede encontrar las variables requeridas en el alcance anidado, el motor generará una excepción.
foo(a){ varb=a; devolver a+b; } var c=foo(2)
problema: encontrar todas las consultas LHS y RHS
Respuesta: LHS(c=…,a=2,b=…) y RHS(foo(2…,=a,a…,…b))