3. El tipo se origina en JavaScript y pertenece a JavaScript.
convertir los lenguajes de programación avanzados en instrucciones de máquina finales para su ejecución? , No importa si el JavaScript que escribimos se entrega al navegador o se ejecuta en el nodo, al final debe ser ejecutado por la CPU, por lo que necesitamos que el motor JavaScript nos ayude a traducir el código JavaScript en instrucciones de la CPU para ejecutar
Aquí tomamos WebKit como columna. WebKit en realidad consta de dos partes:
WebCore: responsable del análisis, diseño, renderizado y otros trabajos relacionados de HTML
JavaScriptCore: análisis y ejecución de entorno variable de código JavaScript
objeto variable VO (objeto variable) En el último estándar ECMA, VO ya tiene otro nombre para el entorno variable VE
GO (objeto global) y el contexto de ejecución global
AO (objeto de activación). ) incluye
JavaScript nos asignará memoria al definir variables
JS asigna memoria para tipos de datos básicos directamente en el espacio de la pila durante la ejecución;
La asignación de memoria de JS para tipos de datos complejos abrirá un espacio en la memoria del montón y se referirá a la variable de valor de retorno del puntero de
porque el tamaño de la memoria es limitado , por lo que cuando la memoria ya no lo es. Si es necesario, debemos liberarlo para liberar más espacio en la memoria.
La recolección de basura en inglés es Garbage Collection o GC.
Para los objetos que ya no se utilizan, los llamamos basura. Deben reciclarse para liberar más espacio de memoria. Nuestro entorno de ejecución de lenguaje, como el entorno de ejecución de Java JVM y el motor js del entorno de ejecución de JavaScript, serán un recolector de basura de memoria. recolector de basura, también lo llamamos GC para abreviar, por lo que en muchos lugares se ve que GC en realidad se refiere al recolector de basura
que es la definición de cierre en informática (Wikipedia):
Cierre (inglés: cierre), también conocido como cierre léxico (cierre léxico) o cierre de función (cierres de función);
Es una tecnología que implementa enlace léxico en lenguajes de programación que soportan funciones de primera clase;
En implementación, el cierre es una estructura que almacena una función y un entorno asociado (equivalente a una tabla de búsqueda de símbolos);
La mayor diferencia entre un cierre y una función es que cuando se captura un cierre, sus variables libres se determinarán en el momento de la captura, de modo que pueda ejecutarse como de costumbre incluso si está fuera de contexto en el momento de la captura
. El concepto de cierre apareció en la década de 1960. El primer programa que implementó cierres fue Scheme, por lo que podemos entender por qué hay cierres en JavaScript;
Debido a que muchos diseños en JavaScript se derivan de Scheme;
Echemos un vistazo a la explicación de MDN sobre los cierres de JavaScript:
Una función está empaquetada con una referencia a su estado circundante (entorno léxico) (o la función está rodeada de referencias). En otras palabras, un cierre le permite acceder a ella dentro de una función interna. de su función exterior;
En JavaScript, cada vez que se crea una función, el cierre se creará al mismo tiempo que se crea la función
function foo() {; var nombre = 'por qué' var edad = 18 barra de funciones() { console.log('barra',nombre) } return bar}var fun = foo()fun()
Resumen:
Una función ordinaria es un cierre si puede acceder a las variables libres sobre las que actúa la capa exterior;
Desde una perspectiva amplia: las funciones en JavaScript son cierres;
Desde un punto de vista limitado: si una función en JavaScript accede a una variable externa, es un cierre,
al alcance global:
Navegador: ventana
Entorno de nodo: {}
La función de flecha es un método para escribir funciones agregadas después de ES6 y es más conciso que las expresiones de función;
Las funciones de flecha no vincularán estos atributos y los de los argumentos;
Las funciones de flecha no se pueden usar como constructores (no se pueden usar con new, se generará un error).
Los argumentos son una (pseudo) matriz (similar a una matriz) correspondiente a los parámetros pasados a la función. Comprensión del objeto
Funciones
Existe un concepto muy importante en la programación funcional llamado funciones puras. JavaScript se ajusta a las especificaciones de la programación funcional, por lo que también existe el concepto de funciones puras que
Wikipedia define:
En programación, si una función cumple las siguientes condiciones, entonces esta función se llama función pura. Cuando la función tiene el mismo valor de entrada, necesita producir la misma salida. La salida de la función no tiene nada que ver con otra información oculta. o estados distintos del valor de entrada Las funciones no relacionadas con la salida externa generada por dispositivos de E/S no pueden tener efectos secundarios de función semánticamente observables, como "activar eventos", provocar que los dispositivos de salida emitan o cambiar el contenido de objetos distintos del valor de salida. . Resumen:
Los insumos determinados deben producir ciertos resultados;
Durante la ejecución de una función, no pueden ocurrir efectos secundarios
:
El curry también es un concepto muy importante en la programación funcional. Wikipedia explica:
En informática, Currying (Currying), también traducido como Currying o Currying, es una función que acepta múltiples parámetros, se convierte en una función que recibe un solo parámetro (el primer parámetro de la función original) y devuelve una nueva función que acepta el argumentos restantes y devuelve un resultado Reclamo currado: si corrige ciertos argumentos, obtendrá un
resumen de función que acepta los argumentos restantes:
Pase solo una parte de los parámetros a la función para llamarla y déjela devolver un área de función para procesar los parámetros restantes;
Este proceso se llama curry.
Por qué es necesario curry:
En programación funcional, a menudo esperamos que el problema manejado por una función sea lo más simple posible, en lugar de entregar mucho procesamiento a una función para manejar
la función foo(x,y,c) { devolver x + y + c } consola.log(foo(10,20,30)) //Función de curry suma(x) { función de retorno (y) { función de retorno (z) { devolver x + y + z } } } var a = suma(10)(20)(30) consola.log(a) //Simplifica el curry var sum2 = x => y => z => { devolver x + y + z } console.log(sum2(10)(20)(30))
Función
Por ejemplo, ahora necesitamos llamar a una función con ciertos datos y ejecutar dos funciones fn1 y fn2. Estas dos funciones se ejecutan en secuencia. Si necesitamos llamar a dos funciones cada vez, la operación parecerá repetitiva. ¿Combinar estas dos funciones y llamarlas una tras otra automáticamente?
Este proceso es la combinación de funciones, que llamamos Componer función
con declaración
.
+Función: puede crear su propio alcance. No se recomienda utilizar la instrucción with porque puede ser fuente de errores de confusión y problemas de compatibilidad
. '} // var mensaje = "hola mundo" función foo() { barra de funciones () { con(obj2) { consola.log(mensaje) } } bar() } foo()
eval es una función especial que puede ejecutar la cadena entrante como código JavaScript
var strFn = 'var message = "Hola mundo" console.log(message);'; eval(strFn)
No se recomienda utilizar eval en desarrollo:
La legibilidad del código de evaluación es muy pobre (la legibilidad del código es un principio importante del código de alta calidad);
eval es una cadena, por lo que puede ser manipulada durante la ejecución, lo que puede provocar el riesgo de ser atacado;
La ejecución de eval debe pasar por el intérprete JS y debe ser optimizada por el motor JS.
es un modo JavaScript restrictivo, lo que hace que el código se separe implícitamente del "modo descuidado". Cuando los navegadores que admiten el modo estricto detectan el modo estricto en el código, monitorearán y ejecutarán el código de una manera más estricta. El modo estricto eliminará algunos errores silenciosos originales al generar errores. El modo estricto permite que el motor Js pueda realizar más optimizaciones. al ejecutar código periódicamente (no es necesario lidiar con alguna sintaxis especial)
"use estricto"; // Activar el modo estricto var message = "hello world" console.log(message)
restricciones del modo estricto <br/> Aquí hablamos de algunas restricciones de sintaxis estrictas en modo estricto:
JavaScript está diseñado para que sea más fácil para los desarrolladores novatos comenzar, por lo que a veces se considera que la sintaxis incorrecta se analiza normalmente. Sin embargo, en modo estricto, dichos errores se tratarán como errores para que
// 1. Crear accidentalmente una variable global mensaje = "Hola mundo" consola.log(mensaje) función foo() { edad=20 } foo()El modo estricto
Console.log(age)
//Error estático predeterminado true.name ='xiaoluo'; NaN = 123
// No se permite que los parámetros de función tengan el mismo nombre function foo(x,y,x) { console.log(x,y,x)}foo(10,20,30)
var num = 0o123 // Octal var num2 = 0x123 // Hexadecimal console.log(num,num2)
var obj2 = {name:'Tom',age:18,message:'obj2'} con(obj2) { consola.log(mensaje) }
var para la capa superior strFn = 'var message = "Hola mundo" console.log(message);'; evaluación(cadenaFn)En el modo estricto
console.log (mensaje)
la función indefinida foo() {. console.log(esto) //indefinido } foo()