¿Los parámetros también tienen alcance? Ven a ver esta pregunta, ¿realmente entiendes?

prefacio

Cuando una función pasa parámetros, los parámetros también tienen alcance. ¿Lo has encontrado? Cuando lo escuché, pensé que era increíble, porque básicamente no encontraría códigos similares en el desarrollo diario, solo en algunas preguntas de la entrevista. La prueba es sobre la comprensión general de la función. Hoy hablemos en detalle sobre el alcance de los parámetros en las funciones.

imagen.png

ejemplo

Mire el código a continuación y piense en su salida

var x = 0
var k = 99
function bar(s = () => { console.log(this); }) {
  var j = 'zj'
  function foo(x,
    y = function () { x = 3; k = 100; j = 'yy'; console.log(x); },
    a = () => { console.log(this); }
  ) {
    console.log(x)
    var x = 2
    var k = 88
    console.log(j);
    y()
    a()
    console.log(x)
    console.log(k)
  }

  foo.call({ name: 'ving' }, 1)
  console.log(j);
  s()
}
bar.call({ name: 'king' })
console.log(x)
console.log(k)

复制代码

Después de leerlo, ¿cuál es tu respuesta?

// 1
// zj
// 3
// {name:ving}
// 2
// 88
// yy 
// {name:king}
// 0
// 100
复制代码

El guapo que contestó correctamente puede poner arrogancia en los comentarios

imagen.png

De todos modos, eso es lo que vi.

imagen.png

Analizar gramaticalmente

Primero, comprendamos qué es el alcance del parámetro.
¿Cómo se forma el alcance del parámetro? ¿Todas las funciones tienen alcance del parámetro?
No, solo cuando el parámetro de una función tiene un valor predeterminado, la función forma un nuevo alcance, que se usa para contener el valor del parámetro . Es decir, la función ahora tiene dos ámbitos, un ámbito de parámetro y un ámbito de cuerpo de función.
Entonces, ¿cuál es la relación entre estos dos ámbitos?
Está bien, es broma. Precisamente importa un poco. Estos dos ámbitos son independientes entre sí (¡no hay relación de contención!), y la conexión entre ellos solo se puede comunicar a través de parámetros. Es decir, cuando el alcance del parámetro cambia el valor del parámetro, afectará el cambio del valor en el alcance del cuerpo de la función. Esto es un poco abstracto, y lo entenderemos cuando lo analicemos a través del código. Otra cosa a tener en cuenta es que el alcance superior del alcance del parámetro y el alcance superior del alcance del cuerpo de la función son iguales.

var x = 0
var k = 99
function bar(s = () => { console.log(this); // 八 }) {
  var j = 'zj'
  function foo(x,
    y = function () { x = 3; k = 100; j = 'yy'; console.log(x); // 三 },
    a = () => { console.log(this);// 四 }
  ) {
    console.log(x) // 一
    var x = 2
    var k = 88
    console.log(j); // 二
    y()
    a()
    console.log(x) // 五
    console.log(k) // 六
  }

  foo.call({ name: 'ving' }, 1)
  console.log(j); // 七
  s()
}
bar.call({ name: 'king' })
console.log(x) // 九
console.log(k) // 十

复制代码

Como arriba, marqué el orden de ejecución del código, analicémoslo paso a paso.
Uno: después de promover la variable de análisis previo de la función, foo pasa el valor 1 para cambiar x = 1
Dos: el alcance del parámetro es independiente del alcance del cuerpo de la función, por lo que el acceso es j = 'zj' en la barra de alcance superior
Tercero : El alcance del parámetro tiene x Si no, buscará bar--> ventana en lugar del alcance del cuerpo de la función foo. Entonces x = 3
cuatro: a es una función de flecha, y la función de flecha apunta al alcance superior. (El alcance superior del alcance del parámetro y el alcance superior del alcance del cuerpo de la función son iguales) Entonces this = {name:ving} Ver el siguiente análisis de código y diagrama

function bar(s = () => {  console.log(this); // { name: 'king' } }) {
  const jj = () => {
    console.log(this); // { name: 'king' }
  }
  jj()
  s()
}
bar.call({ name: 'king' })
复制代码

dibujar

imagen.png

Cinco: El alcance del cuerpo de la función tiene un valor x = 2
Seis: Igual que arriba k = 88
Siete: El alcance del cuerpo de la función tiene un valor pero cuando se ejecuta el proceso tres, j se reasigna, de modo que j = 'yy'
Ocho: Igual que el cuarto ejemplo, this = { nombre:rey}
Nueve: x = 0 El primer parámetro x que cambia cuando se ejecuta el tercer proceso no es el x global, por lo que el global no cambia
Diez: k = 100 Cuando se ejecuta el tercer proceso , la k global se cambia porque el alcance del parámetro no tiene k y no hay un alcance superior, solo se puede encontrar k en la ventana de nivel superior

final

¡Se acabó, lo entiendo!

imagen.png

Los puntos clave de este tipo de tema en un resumen simple:
1. El alcance del parámetro y el alcance del cuerpo de la función son independientes entre sí, pero su alcance de nivel superior es el mismo.
2. esto apunta a: esto en la función de flecha en el alcance del parámetro apunta a su alcance anterior, que es el suyo propio este

Recuerde estos dos puntos, en el futuro, preguntas similares cambiarán la sopa en lugar de la medicina.
¡Dale me gusta! Yanzu

imagen.png

Supongo que te gusta

Origin juejin.im/post/7079266572115640357
Recomendado
Clasificación