From 97b15a2fb5ba8553eb25593ea41a433bd6c73bd5 Mon Sep 17 00:00:00 2001 From: aalex198 Date: Wed, 24 Jun 2026 12:34:22 +0300 Subject: [PATCH] docs: improve explanation for question 2 (var vs let hoisting) across all 22 translations --- README.md | 4 ++-- ar-AR/README_AR.md | 4 ++-- ar-EG/README_ar-EG.md | 4 ++-- bs-BS/README-bs_BS.md | 4 ++-- de-DE/README.md | 4 ++-- es-ES/README-ES.md | 4 ++-- fr-FR/README_fr-FR.md | 4 ++-- id-ID/README.md | 4 ++-- it-IT/README.md | 4 ++-- ja-JA/README-ja_JA.md | 4 ++-- ko-KR/README-ko_KR.md | 4 ++-- nl-NL/README.md | 4 ++-- pl-PL/README.md | 4 ++-- pt-BR/README_pt_BR.md | 4 ++-- ro-RO/README.ro.md | 4 ++-- ru-RU/README.md | 4 ++-- sq-KS/README_sq_KS.md | 4 ++-- th-TH/README.md | 4 ++-- tr-TR/README-tr_TR.md | 4 ++-- uk-UA/README.md | 4 ++-- vi-VI/README-vi.md | 4 ++-- zh-CN/README-zh_CN.md | 4 ++-- zh-TW/README_zh-TW.md | 4 ++-- 23 files changed, 46 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index b203a060..c96b660c 100644 --- a/README.md +++ b/README.md @@ -104,9 +104,9 @@ for (let i = 0; i < 3; i++) { #### Answer: C -Because of the event queue in JavaScript, the `setTimeout` callback function is called _after_ the loop has been executed. Since the variable `i` in the first loop was declared using the `var` keyword, this value was global. During the loop, we incremented the value of `i` by `1` each time, using the unary operator `++`. By the time the `setTimeout` callback function was invoked, `i` was equal to `3` in the first example. +Because of the event queue in JavaScript, the `setTimeout` callback function is called _after_ the loop has been executed. Since the variable `i` in the first loop was declared using the `var` keyword, this value was global. During the loop, we incremented the value of `i` by `1` each time, using the unary operator `++`. By the time the `setTimeout` callback function was invoked, `i` was equal to `3` in the first example. Due to hoisting, `var` allocates a single memory slot for the variable, so each iteration overwrites the same variable rather than creating a new one. -In the second loop, the variable `i` was declared using the `let` keyword: variables declared with the `let` (and `const`) keyword are block-scoped (a block is anything between `{ }`). During each iteration, `i` will have a new value, and each value is scoped inside the loop. +In the second loop, the variable `i` was declared using the `let` keyword: variables declared with the `let` (and `const`) keyword are block-scoped (a block is anything between `{ }`). During each iteration, `i` will have a new value, and each value is scoped inside the loop. Unlike `var`, `let` creates a new binding (a new memory slot) for each iteration, which is why each `setTimeout` callback captures a different value.

diff --git a/ar-AR/README_AR.md b/ar-AR/README_AR.md index ace6ed98..7a767030 100644 --- a/ar-AR/README_AR.md +++ b/ar-AR/README_AR.md @@ -98,8 +98,8 @@ for (let i = 0; i < 3; i++) {
الإجابة هي الخيار الثالث: C -بسبب ترتيب تسلسل الأحداث في الجافا سكريبت, دالة `setTimeout` والتي هي دالة من نوع callbackقد تم استدعائها بعد ان تم تنفيذ ال loop. بماأن المتغير `i` في الloop الاولى قد تم تعريفه عن طريق الكلمة المفتاحية `var` فإن هذه القيمة هي global. أثناء تنفيذ هذه ال loop قد تم إضافة 1 الى المتغير `var` في كل دورة باستخدام العملية `++`. بنهاية الدورة و عندما تم استدعاء الدالة `setTimeout` كانت قيمة المتغير `i` قد أصبحت تساوي `3` في المثال الأول. -في الloop الثانية ,تم تعريف المتغير `i` باستخدام الكلمة المفتاحية `let` المتغيرات التي يتم تعريفها باستخدام الكلمات المفتاحية `let` و `const` هي متغيرات تنتمي فقط للBlock الذي تم تعريفها بداخله, والذي هو بين القوسين, أثناءتنفيذ الloop, سنقوم بالتحصل على قيمة جديدة للمتغير `i` في نهاية كل دورة , وأي قيمة تكون منتمية للScope بداخل الloop. +بسبب ترتيب تسلسل الأحداث في الجافا سكريبت, دالة `setTimeout` والتي هي دالة من نوع callbackقد تم استدعائها بعد ان تم تنفيذ ال loop. بماأن المتغير `i` في الloop الاولى قد تم تعريفه عن طريق الكلمة المفتاحية `var` فإن هذه القيمة هي global. أثناء تنفيذ هذه ال loop قد تم إضافة 1 الى المتغير `var` في كل دورة باستخدام العملية `++`. بنهاية الدورة و عندما تم استدعاء الدالة `setTimeout` كانت قيمة المتغير `i` قد أصبحت تساوي `3` في المثال الأول. بسبب الـ hoisting، `var` يخصص مساحة ذاكرة واحدة للمتغير، لذلك كل تكرار يعيد كتابة نفس المتغير بدلاً من إنشاء متغير جديد. +في الloop الثانية ,تم تعريف المتغير `i` باستخدام الكلمة المفتاحية `let` المتغيرات التي يتم تعريفها باستخدام الكلمات المفتاحية `let` و `const` هي متغيرات تنتمي فقط للBlock الذي تم تعريفها بداخله, والذي هو بين القوسين, أثناءتنفيذ الloop, سنقوم بالتحصل على قيمة جديدة للمتغير `i` في نهاية كل دورة , وأي قيمة تكون منتمية للScope بداخل الloop. على عكس `var`، `let` ينشئ ربطاً جديداً (مساحة ذاكرة جديدة) لكل تكرار، ولهذا السبب كل callback لـ `setTimeout` يلتقط قيمة مختلفة.

diff --git a/ar-EG/README_ar-EG.md b/ar-EG/README_ar-EG.md index b9024d95..3c618097 100644 --- a/ar-EG/README_ar-EG.md +++ b/ar-EG/README_ar-EG.md @@ -68,9 +68,9 @@ for (let i = 0; i < 3; i++) { #### الاجابة: ج -الفنكشن اللي`setTimeout` بتشغلها بيتم تشغليها _بعد_ ما اللووب تخلص بسبب قائمة الاحداث `event queue` في جافاسكربت. بما ان اول لووب اتعملت كان المتغير بتاعها معمول بكلمة `var` اذا كان `global` وبالتالي في اللوب احنا كل شوية كنا بنزود `i` لحد ما وصل ل 3 و _بعد_ كده قامت الفنكشن اللي جوا `setTimeout` اشتغلت. ده كده اول لووب. +الفنكشن اللي`setTimeout` بتشغلها بيتم تشغليها _بعد_ ما اللووب تخلص بسبب قائمة الاحداث `event queue` في جافاسكربت. بما ان اول لووب اتعملت كان المتغير بتاعها معمول بكلمة `var` اذا كان `global` وبالتالي في اللوب احنا كل شوية كنا بنزود `i` لحد ما وصل ل 3 و _بعد_ كده قامت الفنكشن اللي جوا `setTimeout` اشتغلت. ده كده اول لووب. بسبب الـ hoisting، `var` بيخصص مساحة ذاكرة واحدة للمتغير، فكل تكرار بيعيد كتابة نفس المتغير بدل ما يعمل متغير جديد. -اما بقى في تاني لووب المتغير `i` كان معمول بكلمة `let` و بالتالي المنظور بتاعه `scope` محدد بالاقواس المحيطة بيه `block` وبالتالي في كل مره اللوب هتزيد هيكون في قيمة جديدة تماماً للمتغير `i` و كل قيمة من دول موجوده جوا ال`block scope` اللي هي حصلت فيه, و بالتالي هيبقى كأن البرنامج شايف 3 قيم للمتغير `i` في 3 اماكن مختلفه! +اما بقى في تاني لووب المتغير `i` كان معمول بكلمة `let` و بالتالي المنظور بتاعه `scope` محدد بالاقواس المحيطة بيه `block` وبالتالي في كل مره اللوب هتزيد هيكون في قيمة جديدة تماماً للمتغير `i` و كل قيمة من دول موجوده جوا ال`block scope` اللي هي حصلت فيه, و بالتالي هيبقى كأن البرنامج شايف 3 قيم للمتغير `i` في 3 اماكن مختلفه! عكس `var`، `let` بيعمل ربط جديد (مساحة ذاكرة جديدة) لكل تكرار، وعلشان كده كل callback بتاع `setTimeout` بيلتقط قيمة مختلفة.

diff --git a/bs-BS/README-bs_BS.md b/bs-BS/README-bs_BS.md index 33f0384f..0200a7ae 100644 --- a/bs-BS/README-bs_BS.md +++ b/bs-BS/README-bs_BS.md @@ -105,12 +105,12 @@ varijabla `i` u prvoj petlji je deklarirana pomoću ključne riječi` var`, ta je vrijednost bila globalna. Tijekom petlje povećavamo vrijednost `i` svaki put '1', koristeći unarni operator `++`. Do vremena Pozvana je function povratnog poziva `setTimeout`,` i` je bila jednaka `3` u -u prvom primjeru. +u prvom primjeru. Zbog hoistinga, `var` dodjeljuje jedan memorijski slot za varijablu, tako da svaka iteracija prepisuje istu varijablu umjesto da stvara novu. U drugoj petlji, varijabla `i` je deklarirana pomoću` let` ključna riječ: varijable deklarirane s ključnom riječi `let` (i` const`) su block-scoped (blok je sve između `{}`). Tijekom svake iteracije, -`i` će imati novu vrijednost, a svaka vrijednost će biti obuhvaćena unutar petlje. +`i` će imati novu vrijednost, a svaka vrijednost će biti obuhvaćena unutar petlje. Za razliku od `var`, `let` stvara novo vezivanje (novi memorijski slot) za svaku iteraciju, zbog čega svaki `setTimeout` callback hvata drugu vrijednost.

diff --git a/de-DE/README.md b/de-DE/README.md index 0ac8c271..ecdd58f0 100644 --- a/de-DE/README.md +++ b/de-DE/README.md @@ -103,9 +103,9 @@ for (let i = 0; i < 3; i++) { #### Antwort: C -Aufgrund der Event Queue in JavaScript, wird die Callback Funktion in `setTimeout` _nach_ der Schleife ausgeführt. Da die Variable `i` in der ersten Schleife mit dem `var` Keyword definiert wurde, ist dieser Wert global verfügbar. Während der Schleife wird der Wert von `i` jedesmal mithilfe des `++` Operators um `1` erhöht. Zu dem Zeitpunkt, wenn die Callback Funktion in `setTimeout` aufgerufen wird, ist `i` gleich `3` im ersten Beispiel. +Aufgrund der Event Queue in JavaScript, wird die Callback Funktion in `setTimeout` _nach_ der Schleife ausgeführt. Da die Variable `i` in der ersten Schleife mit dem `var` Keyword definiert wurde, ist dieser Wert global verfügbar. Während der Schleife wird der Wert von `i` jedesmal mithilfe des `++` Operators um `1` erhöht. Zu dem Zeitpunkt, wenn die Callback Funktion in `setTimeout` aufgerufen wird, ist `i` gleich `3` im ersten Beispiel. Aufgrund des Hoistings reserviert `var` einen einzigen Speicherplatz für die Variable, sodass jede Iteration dieselbe Variable überschreibt, anstatt eine neue zu erstellen. -In der zweiten Schleife wurde die Variable `i` mit dem `let` Keyword definiert: Variablen, die mit `let` (oder `const`) deklariert werden sind block-scoped (Ein Block ist alles zwischen `{ }`). Während jedem Durchlauf bekommt `i` einen neuen Wert zugewiesen, der jeweils innerhalb des Scopes der Schleife liegt. +In der zweiten Schleife wurde die Variable `i` mit dem `let` Keyword definiert: Variablen, die mit `let` (oder `const`) deklariert werden sind block-scoped (Ein Block ist alles zwischen `{ }`). Während jedem Durchlauf bekommt `i` einen neuen Wert zugewiesen, der jeweils innerhalb des Scopes der Schleife liegt. Im Gegensatz zu `var` erstellt `let` bei jeder Iteration eine neue Bindung (einen neuen Speicherplatz), weshalb jeder `setTimeout`-Callback einen anderen Wert erfasst.

diff --git a/es-ES/README-ES.md b/es-ES/README-ES.md index e839d901..977f07f6 100644 --- a/es-ES/README-ES.md +++ b/es-ES/README-ES.md @@ -90,9 +90,9 @@ for (let i = 0; i < 3; i++) { #### Respuesta correcta: C -Debido a la cola de eventos en JavaScript, la función `setTimeout` se llama una vez el ciclo se ha ejecutado. Dado que la variable `i` en el primer bucle se declaró utilizando la palabra reservada ` var`, este valor es global. Durante el bucle, incrementamos el valor de `i` en` 1` cada vez, utilizando el operador unario `++`. Cuando se invocó la función `setTimeout`,` i` era igual a `3` en el primer ejemplo. +Debido a la cola de eventos en JavaScript, la función `setTimeout` se llama una vez el ciclo se ha ejecutado. Dado que la variable `i` en el primer bucle se declaró utilizando la palabra reservada ` var`, este valor es global. Durante el bucle, incrementamos el valor de `i` en` 1` cada vez, utilizando el operador unario `++`. Cuando se invocó la función `setTimeout`,` i` era igual a `3` en el primer ejemplo. Debido al hoisting, `var` asigna una única ranura de memoria para la variable, por lo que cada iteración sobrescribe la misma variable en lugar de crear una nueva. -En el segundo bucle, la variable `i` se declaró utilizando la palabra reservada` let`: las variables declaradas con la palabra reservada `let` (y` const`) tienen un ámbito de bloque (un bloque es lo que se encuentra entre `{}`). Durante cada iteración, `i` tendrá un nuevo valor, y cada valor se encuentra dentro del bucle. +En el segundo bucle, la variable `i` se declaró utilizando la palabra reservada` let`: las variables declaradas con la palabra reservada `let` (y` const`) tienen un ámbito de bloque (un bloque es lo que se encuentra entre `{}`). Durante cada iteración, `i` tendrá un nuevo valor, y cada valor se encuentra dentro del bucle. A diferencia de `var`, `let` crea un nuevo enlace (una nueva ranura de memoria) en cada iteración, por lo que cada callback de `setTimeout` captura un valor diferente.

diff --git a/fr-FR/README_fr-FR.md b/fr-FR/README_fr-FR.md index 16d0d14e..228f1880 100644 --- a/fr-FR/README_fr-FR.md +++ b/fr-FR/README_fr-FR.md @@ -84,9 +84,9 @@ for (let i = 0; i < 3; i++) { #### Réponse : C -À cause du système de queue dans JavaScript, la fonction de rappel _(callback)_ du `setTimeout` est appelée _après_ que la boucle soit exécutée. Comme la variable `i` dans la première boucle est déclarée avec le mot-clé `var`, c'est une variable globale. Pendant la boucle, nous incrémentons la valeur de `i` de `1` à chaque fois, en utilisant l'opérateur arithmétique `++`. Lorsque la fonction de rappel _(callback)_ du `setTimeout` est invoquée, `i` est égal à `3` dans le premier exemple. +À cause du système de queue dans JavaScript, la fonction de rappel _(callback)_ du `setTimeout` est appelée _après_ que la boucle soit exécutée. Comme la variable `i` dans la première boucle est déclarée avec le mot-clé `var`, c'est une variable globale. Pendant la boucle, nous incrémentons la valeur de `i` de `1` à chaque fois, en utilisant l'opérateur arithmétique `++`. Lorsque la fonction de rappel _(callback)_ du `setTimeout` est invoquée, `i` est égal à `3` dans le premier exemple. En raison du hoisting, `var` alloue un seul emplacement mémoire pour la variable, donc chaque itération écrase la même variable au lieu d'en créer une nouvelle. -Dans la seconde boucle, la variable `i` est déclarée avec le mot clé `let` : les variables déclarées avec `let` (et `const`) ont une portée de bloc (tout ce qui est entre `{ }` est considéré comme un bloc). Pendant chaque itération, `i` aura une nouvelle valeur, et chaque valeur sera définie dans la boucle. +Dans la seconde boucle, la variable `i` est déclarée avec le mot clé `let` : les variables déclarées avec `let` (et `const`) ont une portée de bloc (tout ce qui est entre `{ }` est considéré comme un bloc). Pendant chaque itération, `i` aura une nouvelle valeur, et chaque valeur sera définie dans la boucle. Contrairement à `var`, `let` crée une nouvelle liaison (un nouvel emplacement mémoire) à chaque itération, c'est pourquoi chaque callback `setTimeout` capture une valeur différente.

diff --git a/id-ID/README.md b/id-ID/README.md index 2f238d06..adf43999 100644 --- a/id-ID/README.md +++ b/id-ID/README.md @@ -96,9 +96,9 @@ for (let i = 0; i < 3; i++) { #### Jawaban: C -Karena antrean peristiwa di JavaScript, fungsi callback `setTimeout` disebut _after_ loop telah dijalankan. Karena variabel `i` di loop pertama dideklarasikan menggunakan kata kunci` var`, nilai ini adalah global. Selama perulangan, kita menambah nilai `i` sebesar `1` setiap kali, menggunakan operator unary` ++ `. Pada saat fungsi callback `setTimeout` dipanggil,` i` sama dengan `3` di contoh pertama. +Karena antrean peristiwa di JavaScript, fungsi callback `setTimeout` disebut _after_ loop telah dijalankan. Karena variabel `i` di loop pertama dideklarasikan menggunakan kata kunci` var`, nilai ini adalah global. Selama perulangan, kita menambah nilai `i` sebesar `1` setiap kali, menggunakan operator unary` ++ `. Pada saat fungsi callback `setTimeout` dipanggil,` i` sama dengan `3` di contoh pertama. Karena hoisting, `var` mengalokasikan satu slot memori untuk variabel, sehingga setiap iterasi menimpa variabel yang sama daripada membuat yang baru. -Pada perulangan kedua, variabel `i` dideklarasikan menggunakan kata kunci` let`: variabel yang dideklarasikan dengan kata kunci `let` (dan` const`) memiliki cakupan blok (blok adalah apa saja di antara `{}`). Selama setiap iterasi, `i` akan memiliki nilai baru, dan setiap nilai dicakup di dalam loop. +Pada perulangan kedua, variabel `i` dideklarasikan menggunakan kata kunci` let`: variabel yang dideklarasikan dengan kata kunci `let` (dan` const`) memiliki cakupan blok (blok adalah apa saja di antara `{}`). Selama setiap iterasi, `i` akan memiliki nilai baru, dan setiap nilai dicakup di dalam loop. Tidak seperti `var`, `let` membuat binding baru (slot memori baru) untuk setiap iterasi, itulah sebabnya setiap callback `setTimeout` menangkap nilai yang berbeda.

diff --git a/it-IT/README.md b/it-IT/README.md index 13e465c6..deba21f5 100644 --- a/it-IT/README.md +++ b/it-IT/README.md @@ -107,9 +107,9 @@ for (let i = 0; i < 3; i++) { #### Risposta: C -A causa della coda degli eventi in JavaScript la funzione di callback `setTimeout` viene chiamata _dopo_ che il loop è stato eseguito. Poiché la variabile `i` nel primo loop è stata dichiarata usando la chiave `var`, questo valore è globale. Durante il loop abbiamo incrementato ogni volta il valore di `i` di `1` usando l'operatore unario `++`. Quando è stata invocata la funzione di callback `setTimeout`, `i` nel primo esempio risultava sin dal principio uguale a `3`. +A causa della coda degli eventi in JavaScript la funzione di callback `setTimeout` viene chiamata _dopo_ che il loop è stato eseguito. Poiché la variabile `i` nel primo loop è stata dichiarata usando la chiave `var`, questo valore è globale. Durante il loop abbiamo incrementato ogni volta il valore di `i` di `1` usando l'operatore unario `++`. Quando è stata invocata la funzione di callback `setTimeout`, `i` nel primo esempio risultava sin dal principio uguale a `3`. A causa dell'hoisting, `var` alloca un singolo slot di memoria per la variabile, quindi ogni iterazione sovrascrive la stessa variabile invece di crearne una nuova. -Nel secondo loop, la variabile `i` è stata dichiarata usando la chiave `let`: le variabili dichiarate con la chiave `let` (e `const`) hanno lo scope del blocco (un blocco è qualsiasi cosa tra `{ }`). Durante ogni iterazione, `i` avrà un nuovo valore e ogni valore avrà lo scope all'interno del loop. +Nel secondo loop, la variabile `i` è stata dichiarata usando la chiave `let`: le variabili dichiarate con la chiave `let` (e `const`) hanno lo scope del blocco (un blocco è qualsiasi cosa tra `{ }`). Durante ogni iterazione, `i` avrà un nuovo valore e ogni valore avrà lo scope all'interno del loop. A differenza di `var`, `let` crea un nuovo binding (un nuovo slot di memoria) per ogni iterazione, motivo per cui ogni callback `setTimeout` cattura un valore diverso.

diff --git a/ja-JA/README-ja_JA.md b/ja-JA/README-ja_JA.md index 577982ce..3a8da252 100644 --- a/ja-JA/README-ja_JA.md +++ b/ja-JA/README-ja_JA.md @@ -90,9 +90,9 @@ for (let i = 0; i < 3; i++) { #### 答え: C -JavaScriptのイベントキューのため、`setTimeout`コールバック関数はループが実行された後に呼び出されます。最初のループの変数 `i`は`var`キーワードを使って宣言されているので、この値はグローバル変数となります。ループの間、単項演算子 `++`を使用して、毎回 `i`の値を`1`ずつインクリメントしました。 最初の例では `setTimeout`コールバック関数が呼び出されるまでに`i`は`3`となりました。 +JavaScriptのイベントキューのため、`setTimeout`コールバック関数はループが実行された後に呼び出されます。最初のループの変数 `i`は`var`キーワードを使って宣言されているので、この値はグローバル変数となります。ループの間、単項演算子 `++`を使用して、毎回 `i`の値を`1`ずつインクリメントしました。 最初の例では `setTimeout`コールバック関数が呼び出されるまでに`i`は`3`となりました。ホイスティングにより、`var` は変数に単一のメモリスロットを割り当てるため、各イテレーションは新しい変数を作成するのではなく、同じ変数を上書きします。 -2番目のループでは、変数 `i`が `let`キーワードを使って宣言されました。 `let`(または`const`)キーワードで宣言された変数はブロックスコープです(ブロックは `{}`の間のものです)。それぞれの繰り返しの間、 `i`は新しい値を持ち、それぞれの値はループの内側にあります。 +2番目のループでは、変数 `i`が `let`キーワードを使って宣言されました。 `let`(または`const`)キーワードで宣言された変数はブロックスコープです(ブロックは `{}`の間のものです)。それぞれの繰り返しの間、 `i`は新しい値を持ち、それぞれの値はループの内側にあります。`var` とは異なり、`let` はイテレーションごとに新しいバインディング(新しいメモリスロット)を作成するため、各 `setTimeout` コールバックが異なる値をキャプチャします。

diff --git a/ko-KR/README-ko_KR.md b/ko-KR/README-ko_KR.md index 51411b6b..768529cf 100644 --- a/ko-KR/README-ko_KR.md +++ b/ko-KR/README-ko_KR.md @@ -102,9 +102,9 @@ for (let i = 0; i < 3; i++) { #### 답: C -JavaScript의 이벤트 큐 때문에, `setTimeout`의 콜백 함수는 루프가 실행된 _후에_ 호출돼요. 첫 번째의 루프의 변수 `i`는 `var` 키워드를 사용해 선언되어 전역 값이 돼요. 루프 동안, 단항 연산자 `++`를 사용해 매번 `i`의 값을 `1`씩 증가시켰어요. `setTimeout`콜백 함수가 호출되기까지, 첫 번째 예시에서의 `i`는 `3`이에요. +JavaScript의 이벤트 큐 때문에, `setTimeout`의 콜백 함수는 루프가 실행된 _후에_ 호출돼요. 첫 번째의 루프의 변수 `i`는 `var` 키워드를 사용해 선언되어 전역 값이 돼요. 루프 동안, 단항 연산자 `++`를 사용해 매번 `i`의 값을 `1`씩 증가시켰어요. `setTimeout`콜백 함수가 호출되기까지, 첫 번째 예시에서의 `i`는 `3`이에요. 호이스팅으로 인해 `var`는 변수에 단일 메모리 슬롯을 할당하므로 각 반복이 새 변수를 생성하는 대신 동일한 변수를 덮어씁니다. -두 번째 루프에서, 변수 `i`는 `let` 키워드를 사용해 선언되었어요: `let`(그리고 `const`) 키워드로 선언된 변수는 블록-스코프예요(블록은 `{ }` 사이의 모든 것). 각각을 반복하는 동안, `i`는 새로운 값을 갖게 되고, 각각의 값은 루프 스코프 안에 있어요. +두 번째 루프에서, 변수 `i`는 `let` 키워드를 사용해 선언되었어요: `let`(그리고 `const`) 키워드로 선언된 변수는 블록-스코프예요(블록은 `{ }` 사이의 모든 것). 각각을 반복하는 동안, `i`는 새로운 값을 갖게 되고, 각각의 값은 루프 스코프 안에 있어요. `var`와 달리 `let`은 각 반복마다 새로운 바인딩(새 메모리 슬롯)을 생성하므로 각 `setTimeout` 콜백이 다른 값을 캡처합니다.

diff --git a/nl-NL/README.md b/nl-NL/README.md index ffc14a97..5470ce2e 100644 --- a/nl-NL/README.md +++ b/nl-NL/README.md @@ -98,9 +98,9 @@ for (let i = 0; i < 3; i++) { #### Antwoord: C -Vanwege de Event Queue in JavaScript wordt de `setTimeout` callback functie aangeroepen _nadat_ de volledige loop is uitgevoerd. Omndat in de eerste loop de variabele `i` gedeclareerd wordt met het keyword `var`, wordt deze global gemaakt. Tijdens de loop verhogen we de waarde van `i` met `1` door middel van de unary operator `++`. Tegen de tijd dat de `setTimeout` callback functie wordt aangeroepen is de waarde van `i` al `3`, zoals te zien is in het eerste voorbeeld. +Vanwege de Event Queue in JavaScript wordt de `setTimeout` callback functie aangeroepen _nadat_ de volledige loop is uitgevoerd. Omndat in de eerste loop de variabele `i` gedeclareerd wordt met het keyword `var`, wordt deze global gemaakt. Tijdens de loop verhogen we de waarde van `i` met `1` door middel van de unary operator `++`. Tegen de tijd dat de `setTimeout` callback functie wordt aangeroepen is de waarde van `i` al `3`, zoals te zien is in het eerste voorbeeld. Vanwege hoisting reserveert `var` een enkele geheugenplek voor de variabele, waardoor elke iteratie dezelfde variabele overschrijft in plaats van een nieuwe aan te maken. -In de tweede loop wordt de variabele `i` gedeclareerd met het keyword `let`: variabelen die gedeclareerd worden met het keyword `let` (en `const`) zijn block-scoped (een scope is alles tussen `{ }`). Tijdens elke iteratie zal `i` een nieuwe waarde krijgen, en elke waarde is scoped (te gebruiken tussen `{ }`) in de loop. +In de tweede loop wordt de variabele `i` gedeclareerd met het keyword `let`: variabelen die gedeclareerd worden met het keyword `let` (en `const`) zijn block-scoped (een scope is alles tussen `{ }`). Tijdens elke iteratie zal `i` een nieuwe waarde krijgen, en elke waarde is scoped (te gebruiken tussen `{ }`) in de loop. In tegenstelling tot `var` creëert `let` bij elke iteratie een nieuwe binding (een nieuwe geheugenplek), waardoor elke `setTimeout`-callback een andere waarde vastlegt.

diff --git a/pl-PL/README.md b/pl-PL/README.md index ef1c71d6..2959d61e 100644 --- a/pl-PL/README.md +++ b/pl-PL/README.md @@ -105,9 +105,9 @@ for (let i = 0; i < 3; i++) { #### Odpowiedź: C -Ze względu na kolejkę zdarzeń w JavaScript, funkcja zwrotna `setTimeout` jest wywoływana _po_ wykonaniu pętli. Ponieważ zmienna `i` w pierwszej pętli została zadeklarowana za pomocą słowa kluczowego `var`, jej wartość była globalna. Podczas pętli inkrementowaliśmy wartość `i` o `1` za każdym razem, używając operatora jednoargumentowego `++`. W momencie wywołania funkcji zwrotnej `setTimeout`, `i` miało wartość `3` w pierwszym przykładzie. +Ze względu na kolejkę zdarzeń w JavaScript, funkcja zwrotna `setTimeout` jest wywoływana _po_ wykonaniu pętli. Ponieważ zmienna `i` w pierwszej pętli została zadeklarowana za pomocą słowa kluczowego `var`, jej wartość była globalna. Podczas pętli inkrementowaliśmy wartość `i` o `1` za każdym razem, używając operatora jednoargumentowego `++`. W momencie wywołania funkcji zwrotnej `setTimeout`, `i` miało wartość `3` w pierwszym przykładzie. Z powodu hoistingu, `var` przydziela pojedynczy slot pamięci dla zmiennej, więc każda iteracja nadpisuje tę samą zmienną, zamiast tworzyć nową. -W drugiej pętli zmienna `i` została zadeklarowana za pomocą słowa kluczowego `let`: zmienne zadeklarowane za pomocą słowa kluczowego `let` (i `const`) mają zakres blokowy (blokiem jest cokolwiek między `{ }`). Podczas każdej iteracji `i` będzie miało nową wartość, a każda wartość będzie miała zakres wewnątrz pętli. +W drugiej pętli zmienna `i` została zadeklarowana za pomocą słowa kluczowego `let`: zmienne zadeklarowane za pomocą słowa kluczowego `let` (i `const`) mają zakres blokowy (blokiem jest cokolwiek między `{ }`). Podczas każdej iteracji `i` będzie miało nową wartość, a każda wartość będzie miała zakres wewnątrz pętli. W przeciwieństwie do `var`, `let` tworzy nowe wiązanie (nowy slot pamięci) dla każdej iteracji, dlatego każdy callback `setTimeout` przechwytuje inną wartość.

diff --git a/pt-BR/README_pt_BR.md b/pt-BR/README_pt_BR.md index 54c8daf1..e3da6053 100644 --- a/pt-BR/README_pt_BR.md +++ b/pt-BR/README_pt_BR.md @@ -85,9 +85,9 @@ for (let i = 0; i < 3; i++) { #### Resposta: C -Por causa da fila de eventos em JavaScript, a callback de `setTimeout` é chamada depois do laço ter sido executado. Já que a variável `i` no primeiro laço foi declarada usando a palavra-chave `var`, seu valor era global. Durante o laço, incrementamos o valor de `i` por `1` em cada repetição, usando o operador unário `++`. Quando a callback de `setTimeout` foi chamada, `i` valia `3`. +Por causa da fila de eventos em JavaScript, a callback de `setTimeout` é chamada depois do laço ter sido executado. Já que a variável `i` no primeiro laço foi declarada usando a palavra-chave `var`, seu valor era global. Durante o laço, incrementamos o valor de `i` por `1` em cada repetição, usando o operador unário `++`. Quando a callback de `setTimeout` foi chamada, `i` valia `3`. Devido ao hoisting, `var` aloca um único slot de memória para a variável, então cada iteração sobrescreve a mesma variável em vez de criar uma nova. -No segundo laço, a variável `i` foi declarada usando a palavra-chave `let`: Variáveis declaradas com `let` (e `const`) só são acessíveis nos escopos de seus blocos (um bloco é qualquer código entre `{ }`). Durante cada repetição do laço, `i` vai ter um novo valor, e cada valor tem seu escopo dentro do laço. +No segundo laço, a variável `i` foi declarada usando a palavra-chave `let`: Variáveis declaradas com `let` (e `const`) só são acessíveis nos escopos de seus blocos (um bloco é qualquer código entre `{ }`). Durante cada repetição do laço, `i` vai ter um novo valor, e cada valor tem seu escopo dentro do laço. Ao contrário de `var`, `let` cria uma nova ligação (um novo slot de memória) para cada iteração, e é por isso que cada callback `setTimeout` captura um valor diferente.

diff --git a/ro-RO/README.ro.md b/ro-RO/README.ro.md index 93fc1f4e..2783e043 100644 --- a/ro-RO/README.ro.md +++ b/ro-RO/README.ro.md @@ -101,9 +101,9 @@ for (let i = 0; i < 3; i++) { #### Răspuns: C -Datorită cozii de evenimente din JavaScript, funcția de callback `setTimeout` este apelată _după_ ce bucla a fost executată. Deoarece variabila `i` din prima buclă a fost declarată folosind cuvântul cheie `var`, această valoare a fost globală. În timpul buclei, am incrementat valoarea lui `i` cu `1` de fiecare dată, folosind operatorul unary `++`. Până când funcția de callback `setTimeout` a fost invocată, `i` era egal cu `3` în primul exemplu. +Datorită cozii de evenimente din JavaScript, funcția de callback `setTimeout` este apelată _după_ ce bucla a fost executată. Deoarece variabila `i` din prima buclă a fost declarată folosind cuvântul cheie `var`, această valoare a fost globală. În timpul buclei, am incrementat valoarea lui `i` cu `1` de fiecare dată, folosind operatorul unary `++`. Până când funcția de callback `setTimeout` a fost invocată, `i` era egal cu `3` în primul exemplu. Din cauza hoisting-ului, `var` alocă un singur slot de memorie pentru variabilă, astfel încât fiecare iterație suprascrie aceeași variabilă în loc să creeze una nouă. -În cea de-a doua buclă, variabila `i` a fost declarată folosind cuvântul cheie `let`: variabilele declarate cu cuvântul cheie `let` (și `const`) sunt cu scop la nivel de bloc (un bloc este orice între `{ }`). În fiecare iterație, `i` va avea o valoare nouă, iar fiecare valoare este în cadrul buclei. +În cea de-a doua buclă, variabila `i` a fost declarată folosind cuvântul cheie `let`: variabilele declarate cu cuvântul cheie `let` (și `const`) sunt cu scop la nivel de bloc (un bloc este orice între `{ }`). În fiecare iterație, `i` va avea o valoare nouă, iar fiecare valoare este în cadrul buclei. Spre deosebire de `var`, `let` creează o nouă legătură (un nou slot de memorie) pentru fiecare iterație, motiv pentru care fiecare callback `setTimeout` capturează o valoare diferită.

diff --git a/ru-RU/README.md b/ru-RU/README.md index ace3f67a..4226b69e 100644 --- a/ru-RU/README.md +++ b/ru-RU/README.md @@ -101,9 +101,9 @@ for (let i = 0; i < 3; i++) { #### Ответ: C -Из-за очереди событий в JavaScript, функция `setTimeout` вызывается _после_ того как цикл будет завершен. Так как переменная `i` в первом цикле была определена с помощью `var`, она будет глобальной. В цикле мы каждый раз увеличиваем значение `i` на `1`, используя унарный оператор `++`. К моменту выполнения функции `setTimeout` значение `i` будет равно `3` в первом примере. +Из-за очереди событий в JavaScript, функция `setTimeout` вызывается _после_ того как цикл будет завершен. Так как переменная `i` в первом цикле была определена с помощью `var`, она будет глобальной. В цикле мы каждый раз увеличиваем значение `i` на `1`, используя унарный оператор `++`. К моменту выполнения функции `setTimeout` значение `i` будет равно `3` в первом примере. Из-за всплытия (hoisting) `var` выделяет **одну ячейку памяти** для переменной, поэтому каждая итерация перезаписывает одну и ту же переменную, а не создаёт новую. -Во втором цикле переменная `i` определена с помощью `let`. Такие переменные (а также `const`) имеют блочную область видимости (блок это что угодно между `{ }`). С каждой итерацией `i` будет иметь новое значение, и каждое значение будет замкнуто в своей области видимости внутри цикла. +Во втором цикле переменная `i` определена с помощью `let`. Такие переменные (а также `const`) имеют блочную область видимости (блок это что угодно между `{ }`). С каждой итерацией `i` будет иметь новое значение, и каждое значение будет замкнуто в своей области видимости внутри цикла. В отличие от `var`, `let` создаёт новую привязку (новую ячейку памяти) на каждой итерации, поэтому каждый колбэк `setTimeout` захватывает своё уникальное значение.

diff --git a/sq-KS/README_sq_KS.md b/sq-KS/README_sq_KS.md index 2392abb4..69348ec2 100644 --- a/sq-KS/README_sq_KS.md +++ b/sq-KS/README_sq_KS.md @@ -100,9 +100,9 @@ for (let i = 0; i < 3; i++) { #### Përgjigja: C -Për shkak të ***event queque*** në JavaScript, funksioni callback `setTimeout` thirret pas ekzekutimit të unazës. Pasi që variabla `i` në iterimin e parë u deklarua duke përdorur fjalën kyçe `var`, kjo vlerë ishte globale. Gjatë unazës, ne rritëm vlerën e `i` me `1` çdo herë, duke përdorur operatorin unar `++`. Deri në kohën që funksioni callback `setTimeout` u thirr, `i` ishte e barabartë me `3` në unazën e parë. +Për shkak të ***event queque*** në JavaScript, funksioni callback `setTimeout` thirret pas ekzekutimit të unazës. Pasi që variabla `i` në iterimin e parë u deklarua duke përdorur fjalën kyçe `var`, kjo vlerë ishte globale. Gjatë unazës, ne rritëm vlerën e `i` me `1` çdo herë, duke përdorur operatorin unar `++`. Deri në kohën që funksioni callback `setTimeout` u thirr, `i` ishte e barabartë me `3` në unazën e parë. Për shkak të hoisting-ut, `var` ndan një vend të vetëm në memorie për variablin, kështu që çdo përsëritje mbishkruan të njëjtin variabël në vend që të krijojë një të ri. -Në unazën e dytë, variabla `i` u deklarua duke përdorur fjalën kyçe `let`: variablat e deklaruara me fjalën kyçe `let` (dhe `const`) janë të qasshme në bllok (një bllok është çdo gjë mes `{ }`). Gjatë çdo iteracioni, `i` do të ketë një vlerë të re, dhe çdo vlerë është e qasshme brenda unazës. +Në unazën e dytë, variabla `i` u deklarua duke përdorur fjalën kyçe `let`: variablat e deklaruara me fjalën kyçe `let` (dhe `const`) janë të qasshme në bllok (një bllok është çdo gjë mes `{ }`). Gjatë çdo iteracioni, `i` do të ketë një vlerë të re, dhe çdo vlerë është e qasshme brenda unazës. Ndryshe nga `var`, `let` krijon një lidhje të re (një vend të ri në memorie) për çdo përsëritje, prandaj çdo callback i `setTimeout` kap një vlerë të ndryshme.

diff --git a/th-TH/README.md b/th-TH/README.md index a5948da5..db660595 100644 --- a/th-TH/README.md +++ b/th-TH/README.md @@ -97,9 +97,9 @@ for (let i = 0; i < 3; i++) { #### คำตอบ: C -เพราะว่าลำดับเหตุการที่เกิดขึ้นใน Javascript ฟังก์ชัน `setTimeout` ที่เป็น callback ถูกเรียก _หลังจาก_ loop รันเสร็จ เนื่องจากตัวแปร `i` ใน loop แรกถูกประกาศด้วยคีย์เวิร์ด `var` จึงทำให้มันเป็น global scope ระหว่างการวนรอบ loop เป็นการเพิ่มค่า `i` ที่ละ `1` ในแต่ละครั้งด้วย unary operator `++`. ในเวลาที่ `setTimeout` callback ถูกเรียก แต่ว่าค่า `i` มีค่าเท่ากับ `3` แล้วดังตัวอย่างแรก +เพราะว่าลำดับเหตุการที่เกิดขึ้นใน Javascript ฟังก์ชัน `setTimeout` ที่เป็น callback ถูกเรียก _หลังจาก_ loop รันเสร็จ เนื่องจากตัวแปร `i` ใน loop แรกถูกประกาศด้วยคีย์เวิร์ด `var` จึงทำให้มันเป็น global scope ระหว่างการวนรอบ loop เป็นการเพิ่มค่า `i` ที่ละ `1` ในแต่ละครั้งด้วย unary operator `++`. ในเวลาที่ `setTimeout` callback ถูกเรียก แต่ว่าค่า `i` มีค่าเท่ากับ `3` แล้วดังตัวอย่างแรก เนื่องจากการ hoisting, `var` จัดสรรหน่วยความจำเพียงช่องเดียวสำหรับตัวแปร ดังนั้นแต่ละรอบการวนซ้ำจะเขียนทับตัวแปรเดียวกันแทนที่จะสร้างตัวแปรใหม่ -ใน loop ที่สอง ตัวแปร `i` ถูกประกาศโดยใช้คีย์เวิร์ด `let` : ตัวแปรที่ประกาศด้วยคีย์เวิร์ด `let` (และ `const`) เป็น block-scope (block คืออะไรก็ตามที่อยู่ภายใน `{ }`) ค่า `i` แต่ละค่าจะถูกกำหนดขอบเขตภายใน loop ในเวลาที่ `setTimeout` callback ถูกเรียก ค่า `i` แต่ละค่าจะเป็นค่าเฉพาะของแต่ละ callback `1 2 และ 3` ตามละดับ +ใน loop ที่สอง ตัวแปร `i` ถูกประกาศโดยใช้คีย์เวิร์ด `let` : ตัวแปรที่ประกาศด้วยคีย์เวิร์ด `let` (และ `const`) เป็น block-scope (block คืออะไรก็ตามที่อยู่ภายใน `{ }`) ค่า `i` แต่ละค่าจะถูกกำหนดขอบเขตภายใน loop ในเวลาที่ `setTimeout` callback ถูกเรียก ค่า `i` แต่ละค่าจะเป็นค่าเฉพาะของแต่ละ callback `1 2 และ 3` ตามละดับ แตกต่างจาก `var` ตรงที่ `let` สร้าง binding ใหม่ (ช่องหน่วยความจำใหม่) ในแต่ละรอบการวนซ้ำ ซึ่งเป็นสาเหตุที่ callback ของ `setTimeout` แต่ละตัวเก็บค่าที่แตกต่างกัน

diff --git a/tr-TR/README-tr_TR.md b/tr-TR/README-tr_TR.md index f1b36c1f..d8dc80cf 100644 --- a/tr-TR/README-tr_TR.md +++ b/tr-TR/README-tr_TR.md @@ -89,9 +89,9 @@ for (let i = 0; i < 3; i++) { #### Cevap: C -Javascript'deki olay kuyruğundan dolayı, `setTimeout` callback fonksiyonu, döngü uygulandıktan _sonra_ çağrılır. `i` değişkeni, ilk döngü sırasında `var` anahtar kelimesi ile tanımlandığından, bu değişken globaldir. Döngü boyunca, `++` unary operatörünü kullanarak, `i`'nin değerini her seferinde `1` arttırdık. İlk örnekte, `setTimeout` callback fonksiyonu çağrıldığı zaman, `i`'nin değeri `3`'e eşitti. +Javascript'deki olay kuyruğundan dolayı, `setTimeout` callback fonksiyonu, döngü uygulandıktan _sonra_ çağrılır. `i` değişkeni, ilk döngü sırasında `var` anahtar kelimesi ile tanımlandığından, bu değişken globaldir. Döngü boyunca, `++` unary operatörünü kullanarak, `i`'nin değerini her seferinde `1` arttırdık. İlk örnekte, `setTimeout` callback fonksiyonu çağrıldığı zaman, `i`'nin değeri `3`'e eşitti. Hoisting nedeniyle, `var` değişken için tek bir bellek alanı ayırır, bu nedenle her yineleme yeni bir değişken oluşturmak yerine aynı değişkenin üzerine yazar. -İkinci döngüde, `i` değişkeni `let` anahtar kelimesi kullanılarak tanımlandı: `let` (ve `const`) ile tanımlanan değişkenler "block-scope"dur (block `{}` arasındaki herhangi bir şeydir). Her bir tekrarda, `i` yeni değere sahip olacak ve her değer döngü içinde "scoped" olacak. +İkinci döngüde, `i` değişkeni `let` anahtar kelimesi kullanılarak tanımlandı: `let` (ve `const`) ile tanımlanan değişkenler "block-scope"dur (block `{}` arasındaki herhangi bir şeydir). Her bir tekrarda, `i` yeni değere sahip olacak ve her değer döngü içinde "scoped" olacak. `var`'ın aksine, `let` her yineleme için yeni bir bağlama (yeni bir bellek alanı) oluşturur, bu nedenle her `setTimeout` callback'i farklı bir değer yakalar.

diff --git a/uk-UA/README.md b/uk-UA/README.md index 6498cc94..fda66a00 100644 --- a/uk-UA/README.md +++ b/uk-UA/README.md @@ -84,9 +84,9 @@ for (let i = 0; i < 3; i++) { #### Відповідь: C -Через черги подій в JavaScript, функція `setTimeout` викликається _після того_ як цикл буде завершено. Так як змінна `i` в першому циклі була визначена за допомогою `var`, вона буде глобальною. У циклі ми кожен раз збільшуємо значення `i` на `1`, використовуючи унарний оператор `++.` До моменту виконання функції `setTimeout` значення `i` дорівнюватиме `3`, як показано в першому прикладі. +Через черги подій в JavaScript, функція `setTimeout` викликається _після того_ як цикл буде завершено. Так як змінна `i` в першому циклі була визначена за допомогою `var`, вона буде глобальною. У циклі ми кожен раз збільшуємо значення `i` на `1`, використовуючи унарний оператор `++.` До моменту виконання функції `setTimeout` значення `i` дорівнюватиме `3`, як показано в першому прикладі. Через hoisting, `var` виділяє єдину комірку пам'яті для змінної, тому кожна ітерація перезаписує ту саму змінну, а не створює нову. -У другому циклі змінна `i` визначена за допомогою `let`. Такі змінні (а також `const`) мають блокову область видимості (блок це що завгодно між `{}`). З кожною ітерацією `i` матиме нове значення, і кожне значення буде замкнуто у своїй області видимості всередині циклу. +У другому циклі змінна `i` визначена за допомогою `let`. Такі змінні (а також `const`) мають блокову область видимості (блок це що завгодно між `{}`). З кожною ітерацією `i` матиме нове значення, і кожне значення буде замкнуто у своїй області видимості всередині циклу. На відміну від `var`, `let` створює нове зв'язування (нову комірку пам'яті) для кожної ітерації, тому кожен колбек `setTimeout` захоплює різне значення.

diff --git a/vi-VI/README-vi.md b/vi-VI/README-vi.md index f8ab661d..00cc235f 100644 --- a/vi-VI/README-vi.md +++ b/vi-VI/README-vi.md @@ -85,9 +85,9 @@ for (let i = 0; i < 3; i++) { #### Đáp án: C -Bởi vì event queue trong JavaScript, hàm `setTimeout` callback sẽ được gọi _sau khi_ vòng lặp được thực hiện. Bời vì biến `i` trong vòng lặp đầu tiên được khai báo với từ khóa `var`, nên nó sẽ là một biến global. Trong suốt vòng lặp, mỗi lần chúng ta tăng giá trị của `i` lên `1`, sử dụng phép toán `++`. Cho tới khi callback `setTimeout` được gọi, giá trị của `i` đã trở thành `3` rồi. +Bởi vì event queue trong JavaScript, hàm `setTimeout` callback sẽ được gọi _sau khi_ vòng lặp được thực hiện. Bời vì biến `i` trong vòng lặp đầu tiên được khai báo với từ khóa `var`, nên nó sẽ là một biến global. Trong suốt vòng lặp, mỗi lần chúng ta tăng giá trị của `i` lên `1`, sử dụng phép toán `++`. Cho tới khi callback `setTimeout` được gọi, giá trị của `i` đã trở thành `3` rồi. Do hoisting, `var` cấp phát một ô nhớ duy nhất cho biến, vì vậy mỗi lần lặp ghi đè lên cùng một biến thay vì tạo ra một biến mới. -Trong vòng lặp thứ 2, biến `i` được khai báo với từ khóa `let`, có nghĩa nó là một biến block-scoped (block là những gì được viết bên trong cặp ngoặc `{ }`). Tại mỗi vòng lặp, `i` sẽ là một biến mới có một giá trị mới, và giá trị đó có scope là bên trong vòng lặp mà thôi. +Trong vòng lặp thứ 2, biến `i` được khai báo với từ khóa `let`, có nghĩa nó là một biến block-scoped (block là những gì được viết bên trong cặp ngoặc `{ }`). Tại mỗi vòng lặp, `i` sẽ là một biến mới có một giá trị mới, và giá trị đó có scope là bên trong vòng lặp mà thôi. Không giống như `var`, `let` tạo một ràng buộc mới (một ô nhớ mới) cho mỗi lần lặp, đó là lý do tại sao mỗi callback `setTimeout` lại capture một giá trị khác nhau.

diff --git a/zh-CN/README-zh_CN.md b/zh-CN/README-zh_CN.md index 52ca1ee0..b9cd3a35 100644 --- a/zh-CN/README-zh_CN.md +++ b/zh-CN/README-zh_CN.md @@ -62,9 +62,9 @@ for (let i = 0; i < 3; i++) { #### 答案:C -由于 JavaScript 的事件循环,`setTimeout` 回调会在*遍历结束后*才执行。因为在第一个遍历中遍历 `i` 是通过 `var` 关键字声明的,所以这个值是全局作用域下的。在遍历过程中,我们通过一元操作符 `++` 来每次递增 `i` 的值。当 `setTimeout` 回调执行的时候,`i` 的值等于 3。 +由于 JavaScript 的事件循环,`setTimeout` 回调会在*遍历结束后*才执行。因为在第一个遍历中遍历 `i` 是通过 `var` 关键字声明的,所以这个值是全局作用域下的。在遍历过程中,我们通过一元操作符 `++` 来每次递增 `i` 的值。当 `setTimeout` 回调执行的时候,`i` 的值等于 3。由于变量提升(hoisting),`var` 只为变量分配一个内存单元,因此每次迭代都会覆盖同一个变量,而不是创建一个新的变量。 -在第二个遍历中,遍历 `i` 是通过 `let` 关键字声明的:通过 `let` 和 `const` 关键字声明的变量是拥有块级作用域(指的是任何在 {} 中的内容)。在每次的遍历过程中,`i` 都有一个新值,并且每个值都在循环内的作用域中。 +在第二个遍历中,遍历 `i` 是通过 `let` 关键字声明的:通过 `let` 和 `const` 关键字声明的变量是拥有块级作用域(指的是任何在 {} 中的内容)。在每次的遍历过程中,`i` 都有一个新值,并且每个值都在循环内的作用域中。与 `var` 不同,`let` 在每次迭代中都会创建一个新的绑定(新的内存单元),这就是为什么每个 `setTimeout` 回调捕获的值都不同。

diff --git a/zh-TW/README_zh-TW.md b/zh-TW/README_zh-TW.md index b6bf9c06..fe6b0477 100644 --- a/zh-TW/README_zh-TW.md +++ b/zh-TW/README_zh-TW.md @@ -75,9 +75,9 @@ for (let i = 0; i < 3; i++) { #### 答案:C 由於 JavaScript 的事件佇列(Event Queue),`setTimeout` 的 `callback` 會在*遍歷結束後*才執行。因為在第一個迴圈中,遍歷 `i` 是透過 `var` 關鍵字宣告的,`var` 屬於 Function scope(需要用 `function() {}` 才能將值鎖在作用域裡面) -,所以 `for` 迴圈會造成變數外流,變成全域變數。在遍歷過程中,我們透過一元運算子 `++` 來遞增 `i` 的值。當 `setTimeout` 的 `callback` 執行的時候,`i` 的值等於 3。 +,所以 `for` 迴圈會造成變數外流,變成全域變數。在遍歷過程中,我們透過一元運算子 `++` 來遞增 `i` 的值。當 `setTimeout` 的 `callback` 執行的時候,`i` 的值等於 3。由於變數提升(hoisting),`var` 只為變數分配一個記憶體單元,因此每次迭代都會覆蓋同一個變數,而不是建立一個新的變數。 -在第二個迴圈中,遍歷 `i` 是透過 `let` 關鍵字宣告的:透過 `let` 和 `const` 關鍵字的變數擁有塊級作用域(指的是任何在 `{}` 中的内容)。在每次的遍歷過程中,`i` 都有一個新值,每次遍歷時 `i` 值的作用域都在迴圈内。 +在第二個迴圈中,遍歷 `i` 是透過 `let` 關鍵字宣告的:透過 `let` 和 `const` 關鍵字的變數擁有塊級作用域(指的是任何在 `{}` 中的内容)。在每次的遍歷過程中,`i` 都有一個新值,每次遍歷時 `i` 值的作用域都在迴圈内。與 `var` 不同,`let` 在每次迭代中都會建立一個新的繫結(新的記憶體單元),這就是為什麼每個 `setTimeout` 回呼捕獲的值都不同。