Изучайте современный JavaScript с нами совершенно бесплатно!
Решенные задания
Когда вы объявляете переменную с ключевым словом var
, она объявляется глобально, если не внутри функции, и локально, если объявляется внутри функции.
Ключевое слово let
ведет себя аналогично, но с некоторыми дополнениями. Когда вы объявляете переменную с ключевым словом let
внутри блока, оператора или выражения, его область действия ограничена этим блоком, оператором или выражением. Например:
var numArray = [];
for (var i = 0; i < 3; i++) {
numArray.push(i);
}
console.log(numArray); // [0, 1, 2]
console.log(i); // 3
С ключевым словом var
переменная i
объявляется глобально. Поэтому, когда i++
выполняется, он обновляет глобальную переменную.
На самом деле можно чуть-чуть переписать этот код и получить следующее:
// Объявляем массив
var numArray = [];
// Объявляем глобальную переменную i, пока еще без значения
var i;
// Пишем цикл for, задав переменной i начальное значение 0
for (i = 0; i < 3; i++) {
numArray.push(i);
}
console.log(numArray); // [0, 1, 2]
console.log(i); // 3
Такое поведение вызовет проблемы, если вы должны были создать функцию и сохранить ее для последующего использования внутри цикла for, который использует переменную i
. Это связано с тем, что хранимая функция всегда будет ссылаться на значение обновленной глобальной переменной i
.
var printNumTwo;
for (var i = 0; i < 3; i++) {
if (i===2) {
/*
Если i равно 2, переменной printNumTwo
задаем в качестве значения новую фукнцию,
которая при выполнении должна вернуть
значение переменной i
*/
printNumTwo=function() {
/*
Здесь предполагается, что будет возвращено 2,
ведь i равнялась 2,
когда мы создавали функцию
*/
return i;
};
}
}
console.log(printNumTwo());
Как вы можете видеть, printNumTwo()
печатает 3, а не 2 (как изначально предполагалось). Это связано с тем, что значение, присвоенное переменной i
было обновлено далее в цикле, и printNumTwo()
возвращает актуальное значение глобальной переменной i
, а не значение, которое i
имела при создании функции в цикле for.
Ключевое слово let
ведет себя по-другому:
let printNumTwo;
for (let i = 0; i < 3; i++) {
if (i===2) {
printNumTwo=function() {
return i;
};
}
}
console.log(printNumTwo()); // 2
console.log(i); // Uncaught ReferenceError: i is not defined
Здесь в вызове console.log(i)
мы получаем ошибку, что переменная i
не объявлена. Это правильно, так как здесь она объявляется только в инструкции цикла for и не видна за его пределами. printNumTwo()
вернула правильное значение, потому что при каждой итерации цикла for
создавалась новая переменная i
с ключевым словом let
и с уникальным значением (0, 1 и 2 соответственно в каждой итерации). Такое поведение называется Замыканием.Исправьте код, чтобы в выражении if создавалась отдельная переменная i
, которая не будет пересекаться с переменной i
, объявленной в первой строке функции.
Ключевое слово var
не должно использоваться.
Это упражнение предназначено для иллюстрации разницы между тем, как ключевые слова var
и let
назначают область видимости для объявленных переменных. При программировании функции, аналогичной той, которая используется в этом упражнении, часто лучше использовать разные имена переменных, чтобы избежать путаницы.
Объявление const
имеет много вариантов использования в современном JavaScript. Некоторые разработчики предпочитают объявлять все свои переменные, используя ключевое слово const
по умолчанию, если только они не знают, что им нужно будет переназначить это значение (только в этом случае они используют let
). Однако важно понимать, что объекты (включая массивы и функции), назначенные переменным с использованием const
, по-прежнему изменяемы. Использование объявления const
только предотвращает переназначение идентификатора переменной.
const s = [5, 6, 7];
try{
s = [1, 2, 3];
}
catch(error) {
console.error(error)
}
s[2] = 45;
console.log(s);
Как вы можете видеть, вы можете самостоятельно мутировать массив [5, 6, 7]
, а переменная s
все равно укажет на измененный массив [5, 6, 45]
. Как и все массивы, элементы массива в s
изменяемы, но поскольку используется const
, вы не можете задать переменной s
новое значение с использованием оператора присваивания.
Уточнение. Чтобы было понятней в чем здесь разница, следует подробней разобрать какие именно операции выполнялись и почему где-то возникала ошибка, а где-то нет.
s = [1, 2, 3];
Вот здесь выполняется попытка уже существующей переменной s
задать новое значение. Такая операция в случае с константой вызовет ошибку.
s[2] = 45;
А вот здесь мы не переменной s
задаем новое значение, а отдельному элементу массива, который является значением этой переменной. Чтобы это лучше понять, следует помнить, что переменные, которым в качестве значения задаются объекты или массивы, на самом деле являются ссылками на эти объекты. При этом на один и тот же объект могут ссылаться сразу несколько переменных. Вот пример:
const s = [5, 6, 7];
const s2 = s;
s[2] = 45;
console.log(s); // [5, 6, 45]
console.log(s2); // [5, 6, 45]
console.log(s === s2); // true
Таким образом, мы изменили элемент массива только одной переменной, но измененный массив мы получили и во второй переменной, а строгая проверка этих двух переменных на равенство дала истину. Надеюсь, вы из этого поняли, что переменных две, но массив здесь только один, и меняя значения отдельных элементов массива, мы все равно имеем тот же самый массив, на который ссылаются две отдельные переменные.
Массив объявляется как const s = [5, 7, 2]
. Измените массив на [2, 5, 7]
используя различные назначения элементов.
let
не является единственным новым способом объявления переменных. В ES6 вы также можете объявлять переменные, используя ключевое слово const
. const
имеет все потрясающие возможности, которые имеет let
, с дополнительным бонусом - переменные, объявленные с использованием const
, доступны только для чтения. Они являются постоянной величиной. Это означает, что когда переменная объявляется с ключевым словом const
, она не может быть переопределена.
const FAV_PET = "Cats";
FAV_PET = "Dogs"; // Uncaught TypeError: Assignment to constant variable.
Как вы можете видеть, попытка переопределить переменную, объявленную с помощью const
вызовет ошибку.
Во всех случаях, когда вы определяете переменные, значения которых не должны быть изменены, следует объявлять их с ключевым словом const
. Это помогает, когда вы случайно пытаетесь переопределить переменную, которая должна оставаться постоянной.
Внимание: важное отличие const
от let
и var
заключается в том, что переменные с ключевым словом const
обязаны объявляться с инициализирующим значением. Пример объявления с ошибкой:
const a; // Uncaught SyntaxError: Missing initializer in const declaration
Измените код так, чтобы все переменные были объявлены с помощью let
или const
. Используйте let
когда вы хотите, чтобы переменная изменилась, и const
когда вы хотите, чтобы переменная оставалась постоянной. Кроме того, переименуйте переменные, объявленные с помощью const
так, чтобы все буквы были заглавными.
Когда вы объявляете переменную с ключевым словом var
, она объявляется глобально, если не внутри функции, и локально, если объявляется внутри функции.
Ключевое слово let
ведет себя аналогично, но с некоторыми дополнениями. Когда вы объявляете переменную с ключевым словом let
внутри блока, оператора или выражения, его область действия ограничена этим блоком, оператором или выражением. Например:
var numArray = [];
for (var i = 0; i < 3; i++) {
numArray.push(i);
}
console.log(numArray); // [0, 1, 2]
console.log(i); // 3
С ключевым словом var
переменная i
объявляется глобально. Поэтому, когда i++
выполняется, он обновляет глобальную переменную.
На самом деле можно чуть-чуть переписать этот код и получить следующее:
// Объявляем массив
var numArray = [];
// Объявляем глобальную переменную i, пока еще без значения
var i;
// Пишем цикл for, задав переменной i начальное значение 0
for (i = 0; i < 3; i++) {
numArray.push(i);
}
console.log(numArray); // [0, 1, 2]
console.log(i); // 3
Такое поведение вызовет проблемы, если вы должны были создать функцию и сохранить ее для последующего использования внутри цикла for, который использует переменную i
. Это связано с тем, что хранимая функция всегда будет ссылаться на значение обновленной глобальной переменной i
.
var printNumTwo;
for (var i = 0; i < 3; i++) {
if (i===2) {
/*
Если i равно 2, переменной printNumTwo
задаем в качестве значения новую фукнцию,
которая при выполнении должна вернуть
значение переменной i
*/
printNumTwo=function() {
/*
Здесь предполагается, что будет возвращено 2,
ведь i равнялась 2,
когда мы создавали функцию
*/
return i;
};
}
}
console.log(printNumTwo());
Как вы можете видеть, printNumTwo()
печатает 3, а не 2 (как изначально предполагалось). Это связано с тем, что значение, присвоенное переменной i
было обновлено далее в цикле, и printNumTwo()
возвращает актуальное значение глобальной переменной i
, а не значение, которое i
имела при создании функции в цикле for.
Ключевое слово let
ведет себя по-другому:
let printNumTwo;
for (let i = 0; i < 3; i++) {
if (i===2) {
printNumTwo=function() {
return i;
};
}
}
console.log(printNumTwo()); // 2
console.log(i); // Uncaught ReferenceError: i is not defined
Здесь в вызове console.log(i)
мы получаем ошибку, что переменная i
не объявлена. Это правильно, так как здесь она объявляется только в инструкции цикла for и не видна за его пределами. printNumTwo()
вернула правильное значение, потому что при каждой итерации цикла for
создавалась новая переменная i
с ключевым словом let
и с уникальным значением (0, 1 и 2 соответственно в каждой итерации). Такое поведение называется Замыканием.Исправьте код, чтобы в выражении if создавалась отдельная переменная i
, которая не будет пересекаться с переменной i
, объявленной в первой строке функции.
Ключевое слово var
не должно использоваться.
Это упражнение предназначено для иллюстрации разницы между тем, как ключевые слова var
и let
назначают область видимости для объявленных переменных. При программировании функции, аналогичной той, которая используется в этом упражнении, часто лучше использовать разные имена переменных, чтобы избежать путаницы.
Объявление const
имеет много вариантов использования в современном JavaScript. Некоторые разработчики предпочитают объявлять все свои переменные, используя ключевое слово const
по умолчанию, если только они не знают, что им нужно будет переназначить это значение (только в этом случае они используют let
). Однако важно понимать, что объекты (включая массивы и функции), назначенные переменным с использованием const
, по-прежнему изменяемы. Использование объявления const
только предотвращает переназначение идентификатора переменной.
const s = [5, 6, 7];
try{
s = [1, 2, 3];
}
catch(error) {
console.error(error)
}
s[2] = 45;
console.log(s);
Как вы можете видеть, вы можете самостоятельно мутировать массив [5, 6, 7]
, а переменная s
все равно укажет на измененный массив [5, 6, 45]
. Как и все массивы, элементы массива в s
изменяемы, но поскольку используется const
, вы не можете задать переменной s
новое значение с использованием оператора присваивания.
Уточнение. Чтобы было понятней в чем здесь разница, следует подробней разобрать какие именно операции выполнялись и почему где-то возникала ошибка, а где-то нет.
s = [1, 2, 3];
Вот здесь выполняется попытка уже существующей переменной s
задать новое значение. Такая операция в случае с константой вызовет ошибку.
s[2] = 45;
А вот здесь мы не переменной s
задаем новое значение, а отдельному элементу массива, который является значением этой переменной. Чтобы это лучше понять, следует помнить, что переменные, которым в качестве значения задаются объекты или массивы, на самом деле являются ссылками на эти объекты. При этом на один и тот же объект могут ссылаться сразу несколько переменных. Вот пример:
const s = [5, 6, 7];
const s2 = s;
s[2] = 45;
console.log(s); // [5, 6, 45]
console.log(s2); // [5, 6, 45]
console.log(s === s2); // true
Таким образом, мы изменили элемент массива только одной переменной, но измененный массив мы получили и во второй переменной, а строгая проверка этих двух переменных на равенство дала истину. Надеюсь, вы из этого поняли, что переменных две, но массив здесь только один, и меняя значения отдельных элементов массива, мы все равно имеем тот же самый массив, на который ссылаются две отдельные переменные.
Массив объявляется как const s = [5, 7, 2]
. Измените массив на [2, 5, 7]
используя различные назначения элементов.
let
не является единственным новым способом объявления переменных. В ES6 вы также можете объявлять переменные, используя ключевое слово const
. const
имеет все потрясающие возможности, которые имеет let
, с дополнительным бонусом - переменные, объявленные с использованием const
, доступны только для чтения. Они являются постоянной величиной. Это означает, что когда переменная объявляется с ключевым словом const
, она не может быть переопределена.
const FAV_PET = "Cats";
FAV_PET = "Dogs"; // Uncaught TypeError: Assignment to constant variable.
Как вы можете видеть, попытка переопределить переменную, объявленную с помощью const
вызовет ошибку.
Во всех случаях, когда вы определяете переменные, значения которых не должны быть изменены, следует объявлять их с ключевым словом const
. Это помогает, когда вы случайно пытаетесь переопределить переменную, которая должна оставаться постоянной.
Внимание: важное отличие const
от let
и var
заключается в том, что переменные с ключевым словом const
обязаны объявляться с инициализирующим значением. Пример объявления с ошибкой:
const a; // Uncaught SyntaxError: Missing initializer in const declaration
Измените код так, чтобы все переменные были объявлены с помощью let
или const
. Используйте let
когда вы хотите, чтобы переменная изменилась, и const
когда вы хотите, чтобы переменная оставалась постоянной. Кроме того, переименуйте переменные, объявленные с помощью const
так, чтобы все буквы были заглавными.
Когда вы объявляете переменную с ключевым словом var
, она объявляется глобально, если не внутри функции, и локально, если объявляется внутри функции.
Ключевое слово let
ведет себя аналогично, но с некоторыми дополнениями. Когда вы объявляете переменную с ключевым словом let
внутри блока, оператора или выражения, его область действия ограничена этим блоком, оператором или выражением. Например:
var numArray = [];
for (var i = 0; i < 3; i++) {
numArray.push(i);
}
console.log(numArray); // [0, 1, 2]
console.log(i); // 3
С ключевым словом var
переменная i
объявляется глобально. Поэтому, когда i++
выполняется, он обновляет глобальную переменную.
На самом деле можно чуть-чуть переписать этот код и получить следующее:
// Объявляем массив
var numArray = [];
// Объявляем глобальную переменную i, пока еще без значения
var i;
// Пишем цикл for, задав переменной i начальное значение 0
for (i = 0; i < 3; i++) {
numArray.push(i);
}
console.log(numArray); // [0, 1, 2]
console.log(i); // 3
Такое поведение вызовет проблемы, если вы должны были создать функцию и сохранить ее для последующего использования внутри цикла for, который использует переменную i
. Это связано с тем, что хранимая функция всегда будет ссылаться на значение обновленной глобальной переменной i
.
var printNumTwo;
for (var i = 0; i < 3; i++) {
if (i===2) {
/*
Если i равно 2, переменной printNumTwo
задаем в качестве значения новую фукнцию,
которая при выполнении должна вернуть
значение переменной i
*/
printNumTwo=function() {
/*
Здесь предполагается, что будет возвращено 2,
ведь i равнялась 2,
когда мы создавали функцию
*/
return i;
};
}
}
console.log(printNumTwo());
Как вы можете видеть, printNumTwo()
печатает 3, а не 2 (как изначально предполагалось). Это связано с тем, что значение, присвоенное переменной i
было обновлено далее в цикле, и printNumTwo()
возвращает актуальное значение глобальной переменной i
, а не значение, которое i
имела при создании функции в цикле for.
Ключевое слово let
ведет себя по-другому:
let printNumTwo;
for (let i = 0; i < 3; i++) {
if (i===2) {
printNumTwo=function() {
return i;
};
}
}
console.log(printNumTwo()); // 2
console.log(i); // Uncaught ReferenceError: i is not defined
Здесь в вызове console.log(i)
мы получаем ошибку, что переменная i
не объявлена. Это правильно, так как здесь она объявляется только в инструкции цикла for и не видна за его пределами. printNumTwo()
вернула правильное значение, потому что при каждой итерации цикла for
создавалась новая переменная i
с ключевым словом let
и с уникальным значением (0, 1 и 2 соответственно в каждой итерации). Такое поведение называется Замыканием.Исправьте код, чтобы в выражении if создавалась отдельная переменная i
, которая не будет пересекаться с переменной i
, объявленной в первой строке функции.
Ключевое слово var
не должно использоваться.
Это упражнение предназначено для иллюстрации разницы между тем, как ключевые слова var
и let
назначают область видимости для объявленных переменных. При программировании функции, аналогичной той, которая используется в этом упражнении, часто лучше использовать разные имена переменных, чтобы избежать путаницы.
Задачи где нужна помощь
- СтатусЗадачаДата созданияПланируемая дата началаПланируемая дата выполненияДата началаДата выполненияПостановщикКто работает
- Выполняется
Задача: Загрузка картинок из редактора через @prisma-cms/uploader Нужна помощь
Проект: Обучение. Март.
Разбираю Editor.js и уперся: как залить картинку, которую добавляем через редактор.В редакторе есть функция, в которую залетает файл, в ней надо загрузить файл и вернуть полную ссылку на файл.Ругается на .upload(file): Property 'upload' does not exist on type 'typeof Uploader'.ts(2339)Понятно ,что куда-то совсем не туда полез ,нео выползти не получается.Нужна помощь!Вопрос: как правильно пристроить Uploader в этом случае?28 нояб. 2021 г., 14:0615 дек. 2021 г., 6:23 - Выполняется
Задача: Запрос уникального объекта не по id Нужна помощь
Проект: Обучение. Март.
Вытаскиваю из url с помощью useRoute порпаметр поста urlname и по нему делаю фильтр среди всех постов. Работает, но явно это гланды через ж...Как в том случае следкет поступить?24 нояб. 2021 г., 8:5628 июля 2022 г., 10:43 - Выполняется
Задача: Перенести страницы и настроить роутинг 2 Нужна помощь
Проект: Учебный проект на next-js. Покемоны.
Перенести оставшиеся страницы на NextJs:1. Перенести стили из css в styled-components2. Пофикстить Typescript ошибки3. Пофиксить подключение к firebase17 февр. 2021 г., 18:0417 февр. 2021 г., 0:0021 февр. 2021 г., 0:0017 февр. 2021 г., 0:00