Este es un objeto especial dentro de la función. Esto se refiere al objeto de entorno en función del cual se ejecuta la función (haremos explicaciones adicionales al final del artículo). El valor de esto no es seguro antes de llamar a la función. Diferentes métodos de llamadas harán que este valor cambie.
window.num = 22; var o = {num: 11}; función saysnum () {alert (this.num)} saynum (); // 22o.saynum = saynum; o.saynum (); // 11Recuerde: el nombre de la función es solo una variable que contiene un puntero. Por lo tanto, incluso si se ejecuta en diferentes entornos, la función Global Saynum () sigue siendo la misma función que O.Saynum ().
1. Al llamar a una función en el alcance global
Llamado en el alcance global, este objeto se refiere a la ventana
La ejecución de funciones anónimas es global, por lo que este objeto generalmente apunta a la ventana.
función fn1 () {console.log (this);} fn1 ();2. Llamado a través del nuevo operador
Esto hace referencia a un objeto de instancia
Function Person (name) {this.name = name;} persona.prototype.printname = function () {alert (this.name); // byron}; var p1 = nueva persona ('byron');3. Método Llamas como objetos
Esto hace referencia al objeto
var obj1 = {nombre: 'byron', fn: function () {console.log (this); }}; obj1.fn ();4. Llamada indirecta
llamar y aplicar
Cada función contiene dos métodos no heredados: llamar () y aplicar (). El propósito de estos dos métodos es llamar a las funciones en un alcance específico, que en realidad es equivalente a establecer el valor de este objeto en el cuerpo de la función. En otras palabras, la función se llama directamente, y el entorno de ejecución se especifica al llamar
window.color = 'rojo'; var o = {color: 'azul'}; función sayscolor () {alert (this.color);} saycolor.call (this); // rojosaycolor.call (ventana); // rojosaycolor.call (o); // azul(1) Aplicar método
Reciba dos parámetros, uno es el alcance de la función que se ejecuta en la función, y el otro es la matriz de parámetros.
(2) Método de llamada
El método de llamada es el mismo que el método de aplicación, la diferencia es que el método de recepción de parámetros es diferente. Para el método de llamada, el primer parámetro es que este valor no ha cambiado, y el cambio es que los otros parámetros se pasan directamente a la función.
function fn () {console.log (this) // windwow function innerfn () {console.log (this)} innerfn.call (this) // window} fn (); función fn0 () {console.log (this) // ventana} function fn1 () {fn0.call (this); console.log (this); // ventana} fn1 (); función fn0 () {console.log (this) // objeto} var o = {fn1: function fn1 () {fn0.call (this); console.log (this); // objeto}} o.fn1 ();5. Método de la cuenta
Este método crea una instancia de la función cuyo valor está vinculado al valor pasado a la función bind (). Es decir, se devolverá una nueva función y esta dentro de la función será el primer parámetro aprobado.
window.color = 'rojo'; var o = {color: 'azul'}; función sayscolor () {alert (this.color)} var ObjectSayColor = saycolor.bind (o); ObjectSayColor (); // BlueNota complementaria: Ejecutar la definición del entorno
Define variables u otros datos a los que las funciones tienen permiso para acceder. Cada entorno de ejecución tiene un objeto variable asociado con él. Todas las variables y funciones definidas en el entorno se almacenan en este objeto. El código que escribimos no puede acceder a este objeto, pero el analizador lo usará en segundo plano al procesar los datos.
1. Creación del entorno de ejecución:
1. Entorno de ejecución global
En un navegador web, el entorno de ejecución global se considera un objeto de ventana, por lo que todas las variables y funciones globales se crean como propiedades y métodos de objeto de ventana. Cuando el código se carga en el navegador, se crea el entorno de ejecución global (el entorno de ejecución global se destruye solo cuando cerramos la página web o el navegador).
2. Entorno de ejecución local
Cada función tiene su propio entorno de ejecución, por lo que el entorno de ejecución local es un objeto de función. Cuando se llama a una función, se crea el entorno local de la función (después de que se ejecuta el código en la función, el entorno se destruye y todas las variables y definiciones de función almacenadas en él también se destruyen).
Este entorno de ejecución y los objetos variables relacionados son un concepto abstracto, explicado de la siguiente manera
var a = 1; función fn (num1, num2) {var b = 2; función fninner () {var c = 3; alerta (a + b + c); } fninner (); // Creación del entorno de ejecución local Cuando se llama fninner} fn (4,5); // Creación del entorno de ejecución local cuando se llama a FN2. Cadena de alcance
La ejecución de las funciones de JavaScript utiliza una cadena de alcance. Esta cadena de alcance se crea cuando se define la función. Cuando se define una función, en realidad guarda una cadena de alcance. Cuando se llama a esta función, crea un nuevo objeto para almacenar sus variables locales y agrega este objeto a la cadena de alcance guardada. La parte delantera de la cadena de alcance siempre es un objeto variable en el entorno donde se encuentra el código actualmente ejecutado. El final de la cadena de alcance siempre es un objeto variable del entorno de ejecución global. El propósito de la cadena de alcance es garantizar que todas las variables y funciones que tengan permiso para acceder al entorno de ejecución puedan acceder.
var Scope = 'Global Scope'; function checkscope () {var Scope = 'Local Scope'; function f () {return alcope}; return f;} checkscope () (); // alcance localComprensión: cuando se llama al control, la función F se define y se une a la cadena de alcance del control como una variable local. Por lo tanto, no importa a dónde se llame la función F, este enlace sigue siendo válido, por lo que el valor de retorno es el alcance local.
var num1 = 1; function outer () {var num2 = 2; console.log (num1 + num2); // 3 function inner () {// Aquí puede acceder a Num3, Num2, num1 var num3 = 3; console.log (num1 + num2 + num3); // 6} // Aquí puede acceder a num2, inner (), num1 pero no num3 inner ();} outer (); console.log (num1); // 1, ambiente de ejecución // Solo puede acceder a num1 num1Cadena de alcance (búsqueda): el entorno interno puede acceder a todos los entornos externos a través de la cadena de alcance, pero el entorno externo no puede acceder a ninguna variación y funciones en el entorno interno.
var name = 'byron'; función fn () {var name = 'csper'; console.log (nombre); // Casper} fn ();Cuanto más interno es el entorno, mayor será el peso variable.
Nota: Las variables que no se declaran directamente con la palabra clave VAR son variables globales. Por ejemplo, si A = 1 se declara directamente, A es una variable global en este momento.
Cuando el motor Javscript entra en el alcance, procesará el código en dos rondas. La primera ronda, inicialice las variables. La segunda ronda, ejecute el código
var a = 1; función prisión (a) {console.log (a); // 1 var a; console.log (a); // 1} prisión (1);3. Ejecución de funciones
Cuando una llamada de función ingresa al entorno de ejecución, primero los argumentos de proceso, inicialen los parámetros formales (el valor predeterminado no está definido) e inicialice la declaración de función en la función. Cuando el código se ejecuta paso a paso, la declaración variable en la función se inicializa (cuando el código no se ejecuta después de ingresar al entorno, el valor está indefinido). Por lo tanto, el orden de inicialización en la función son los parámetros formales, las declaraciones de la función y las declaraciones variables. Se puede ver desde la imagen de arriba. Déjame darte un ejemplo (todo el entorno global también es una función).
alert (typeof fn); // función, declaración de función en alerta anticipada (typeof fn0); // Declaración de variable indefinida de antemano pero no asignado Función fn () {// Expresión de funciones} var fn0 = function () {// Función Definición} Alert (typeOf fn0); // función, en este momento se ha asignado la variable.