Czy to jest zakres leksykalny?

0

Czy to jest zakres leksykalny?

const outer = () => {
	let car = "Skoda";
  
  const inner = () => {
  	console.log(car);
  }
  
  inner();
}

outer();

W tym przypadku wartość zmiennej car jest brane z zakresu leksykalnego z funkcji outer, prawda? Chodzi mi o to czy dobrze rozumiem co to jest zakres leksykalny.

2

Chodzi o to, że jak zagnieżdżasz kod w JS, to różne konstrukty języka (takie jak funkcje, bloki czy inne) mogą tworzyć własne środowisko leksykalne z własną widocznością zmiennych. I te nazwy mogą być przysłaniane. Np. gdybyś zmodyfikował powyższy przykład:

const outer = () => {
	let car = "Skoda";
  
  const inner = () => {
    let car = 'Ferrari';
  	console.log(car);
  }
  
  inner();
}

outer();

to by wyświetliło Ferrari, bo stworzyłbyś nową zmienną o tej samej nazwie car, która przysłoniłaby tę poprzednią. Tym niemniej tamta poprzednia zmienna dalej by istniała:

const outer = () => {
	let car = "Skoda";
  
  const inner = () => {
    let car = 'Ferrari';
    console.log("from inner", car)
  }
  
  inner();
  console.log("from outer", car)
}

outer();
// from inner Ferrari
// from outer Skoda

oczywiście jakby zmienna nie zostałaby przesłoniona, to z funkcji inner byłaby widoczna zmienna zadeklarowana w funkcji outer, czyli let car = "Skoda";

z zakresu leksykalnego z funkcji outer

Tu trzeba wspomnieć, że używając starej opcji var się deklarowało zmienne na poziomie funkcji (co jest wadą, bo wtedy zmienne mogą się łatwo kolidować na poziomie funkcji), natomiast zmienne deklarowane już za pomocą let czy const można zadeklarować na poziomie bloku:

let foo = 456;
if (true) {
   let foo = 123;
   console.log(foo); // 123
}
console.log(foo); // 456

for (let i = 0; i < 10; i++) {
}
0

Czyli w tym przypadku

const outer = () => {
	let car = "Skoda";
  
  const inner = () => {
  	console.log(car);
  }
  
  inner();
}

outer();

Zakres leksykalny dla funkcji inner to zmienna car?

A jak rozumieć, że zakres leksykalny określany jest w momencie definiowania kodu oraz jak rozumieć, że zakres dynamiczny określany jest w momencie wykonywania kodu?

Do końca nie wiem jak rozumieć te stwierdzenia.

0

Zakres leksykalny dla funkcji inner to zmienna car?

zmienna car pochodzi z zewnętrznego zakresu(czy może bardziej z zewnętrznego "środowiska leksykalnego"(lexical environment)), jest natomiast owszem, widoczna w funkcji inner.

zakres dynamiczny określany jest w momencie wykonywania kodu?

Pewnie chodzi np. o zmienną this.

0
LukeJL napisał(a):

Zakres leksykalny dla funkcji inner to zmienna car?

zmienna car pochodzi z zewnętrznego zakresu(czy może bardziej z zewnętrznego "środowiska leksykalnego"(lexical environment)), jest natomiast owszem, widoczna w funkcji inner.

zakres dynamiczny określany jest w momencie wykonywania kodu?

Pewnie chodzi np. o zmienną this.

Czyli można powiedzieć ogólnie, że zmienna car to zakres leksykalny? Co konkretnie jest w tym przykładzie zakresem leksykalnym?

0

używając języka matematyki można by powiedzieć, że zakres leksykalny to pewien zbiór zmiennych.

0

Bo zakładałem, że każda funkcja ma swój osoby zakres leksykalny i w tym kodzie, który wysyłałem zakresem leksykalnym dla funkcji inner jest zmienna car.

0

Jest taka książka dostępna online You don't know JS.
Są rozdziały o zakresach, może ci się rozjaśni trochę:
https://github.com/getify/You-Dont-Know-JS/tree/2nd-ed/scope-closures

0

To powiedz jeszcze czy w aplikacji w takim razie jest jeden zakres leksykalny czy może być więcej zakresów leksykalnych? Bo z tego co wyżej napisałeś to wygląda tak jakby był tylko jeden zakres leksykalny, a ja mam ciągle wrażenie, że może być ich więcej w aplikacji.

0

no nie, przecież może być ich dużo, zagnieżdżone np. tutaj masz trzy:

const foo = 123;
{
  const bar = 456;
  {
     const baz = 789;
     const foo = "kotek";
  }
}

zobacz też rysunek:
https://github.com/getify/You-Dont-Know-JS/blob/2nd-ed/scope-closures/ch3.md

0

Generalnie wiem jak działa zakres leksykalny. Tylko próbuje określić co w danym przypadku jest zakresem leksykalnym. Ciągle śmiem twierdzić, że zakresem leksykalnym funkcji inner jest zmienna car.

A w Twoim przypadku zakresem leksykalnym dla najbardziej zagnieżdżonego bloku jest boo oraz bar.

1 użytkowników online, w tym zalogowanych: 0, gości: 1