From 980fe00a74a9ad013b945755415ace2e5429c3c2 Mon Sep 17 00:00:00 2001
From: Alexey Pyltsyn Попробуйте выполнить в консоли браузера следующий код: Функция возвращает "Hello" — ничего необычного, верно ? Но что если мы сделаем её асинхронной ? Проверим: Как было сказано ранее, вызов асинхронной функции возвращает объект Promise. Вот пример с async function expression: Также можно использовать стрелочные функции: Все они в общем случае делают одно и то же. Чтобы получить значение, которое возвращает Promise, мы как обычно можем использовать метод или ещё короче Итак, ключевое слово Небольшой пример: Давайте посмотрим на пример из предыдущей статьи: К этому моменту вы должны понимать как работают Promises, чтобы понять все остальное. Давайте перепишем код используя async/await и оценим разницу. Так как ключевое слово function hello() { return "Hello" };
+
function hello() { return "Hello" };
hello();
async function hello() { return "Hello" };
+
async function hello() { return "Hello" };
hello();
let hello = async function() { return "Hello" };
+
let hello = async function() { return "Hello" };
hello();
let hello = async () => { return "Hello" };
+let hello = async () => { return "Hello" };
.then()
:hello().then((value) => console.log(value))
+hello().then((value) => console.log(value))
hello().then(console.log)
+
hello().then(console.log)
async
, превращает обычную функцию в асинхронную и результат вызова функции оборачивает в Promise. Также асинхронная функция позволяет использовать в своём теле ключевое слово await, о котором далее.async function hello() {
+
async function hello() {
return greeting = await Promise.resolve("Hello");
};
@@ -90,7 +90,7 @@ hello().then(alert);
fetch('coffee.jpg')
+
fetch('coffee.jpg')
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
@@ -110,7 +110,7 @@ hello().then(alert);
async function myFetch() {
+
async function myFetch() {
let response = await fetch('coffee.jpg');
if (!response.ok) {
@@ -134,7 +134,7 @@ myFetch()
async
заставляет функцию вернуть Promise, мы можем использовать гибридный подход:async function myFetch() {
+
async function myFetch() {
let response = await fetch('coffee.jpg');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
@@ -160,7 +160,7 @@ myFetch().then((blob) => {
Пример:
let response = await fetch('coffee.jpg');+
let response = await fetch('coffee.jpg');
Значение Promise, которое вернёт fetch()
будет присвоено переменной response
только тогда, когда оно будет доступно - парсер делает паузу на данной строке дожидаясь этого момента. Как только значение доступно, парсер переходит к следующей строке, в которой создаётся объект Blob
из результата Promise. В этой строке, кстати, также используется await
, потому что метод .blob()
также возвращает Promise. Когда результат готов, мы возвращаем его наружу из myFetch()
.
Мы можем использовать синхронную try...catch
структуру с async
/await
. Вот изменённая версия первого примера выше:
async function myFetch() { +async function myFetch() { try { let response = await fetch('coffee.jpg'); @@ -199,7 +199,7 @@ myFetch();Если вы хотите использовать гибридный подходы (пример выше), лучше использовать блок
-.catch()
после блока.then()
вот так:async function myFetch() { +async function myFetch() { let response = await fetch('coffee.jpg'); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); @@ -233,7 +233,7 @@ myFetch().then((blob) => {Версия с async/await (смотрите live demo и source code), сейчас выглядит так:
-async function fetchAndDecode(url, type) { +async function fetchAndDecode(url, type) { let response = await fetch(url); let content; @@ -282,7 +282,7 @@ displayContent()Вы видите, что мы легко изменили
-fetchAndDecode()
функцию в асинхронный вариант. Взгляните на строку сPromise.all()
:let values = await Promise.all([coffee, tea, description]);+let values = await Promise.all([coffee, tea, description]);С помощью
await
мы ждём массив результатов всех трёх Promises и присваиваем его в переменнуюvalues
. Это асинхронный код, но он написан в синхронном стиле, за счёт чего он гораздо читабельнее.
@@ -306,7 +306,7 @@ displayContent()Мы подготовили два примера — slow-async-await.html (см. source code) и fast-async-await.html (см. source code). Они оба начинаются с функции возвращающей promise, имитирующей асинхронность процессов при помощи вызова
-setTimeout()
:function timeoutPromise(interval) { +function timeoutPromise(interval) { return new Promise((resolve, reject) => { setTimeout(function(){ resolve("done"); @@ -316,13 +316,13 @@ displayContent()Далее в каждом примере есть асинхронная функция
-timeTest()
ожидающая три вызоваtimeoutPromise()
:async function timeTest() { +async function timeTest() { ... }В каждом примере функция записывает время начала исполнения и сколько времени понадобилось на исполнение
-timeTest()
промисов, вычитая время в момент запуска функции из времени в момент разрешения промисов:let startTime = Date.now(); +let startTime = Date.now(); timeTest().then(() => { let finishTime = Date.now(); let timeTaken = finishTime - startTime; @@ -333,7 +333,7 @@ timeTest().then(() => {В случае с медленным примером
-slow-async-await.html
,timeTest()
выглядит:async function timeTest() { +async function timeTest() { await timeoutPromise(3000); await timeoutPromise(3000); await timeoutPromise(3000); @@ -343,7 +343,7 @@ timeTest().then(() => {Во втором
-fast-async-await.html
примере, функцияtimeTest()
выглядит как:async function timeTest() { +async function timeTest() { const timeoutPromise1 = timeoutPromise(3000); const timeoutPromise2 = timeoutPromise(3000); const timeoutPromise3 = timeoutPromise(3000); @@ -365,7 +365,7 @@ timeTest().then(() => {В качестве последнего замечания, вы можете использовать
-async
перед методами классов или объектов, вынуждая их возвращать promises. А также await внутри методов объявленных таким образом. Посмотрите на пример ES class code, который мы наблюдали в статье object-oriented JavaScript, и сравните его с модифицированной (асинхронной)async
версией ниже:class Person { +class Person { constructor(first, last, age, gender, interests) { this.name = { first, @@ -389,7 +389,7 @@ let han = new Person('Han', 'Solo', 25, 'male', ['Smuggling']);Первый метод класса теперь можно использовать таким образом:
-han.greeting().then(console.log);+han.greeting().then(console.log);Browser support (Поддержка браузерами)
diff --git a/files/ru/learn/javascript/asynchronous/concepts/index.html b/files/ru/learn/javascript/asynchronous/concepts/index.html index bdc84b6f72..fe4e6c7343 100644 --- a/files/ru/learn/javascript/asynchronous/concepts/index.html +++ b/files/ru/learn/javascript/asynchronous/concepts/index.html @@ -45,7 +45,7 @@ translation_of: Learn/JavaScript/Asynchronous/ConceptsВ нашем simple-sync.html примере (see it running live), добавим кнопке событие на клик, чтобы при нажатии на неё запускалась трудоёмкая операция (расчёт 10000000 дат, и вывод последней рассчитанной даты на консоль) после чего в DOM добавляется ещё один параграф:
-const btn = document.querySelector('button'); +const btn = document.querySelector('button'); btn.addEventListener('click', () => { let myDate; for(let i = 0; i < 10000000; i++) { @@ -75,7 +75,7 @@ btn.addEventListener('click', () => {
function expensiveOperation() { +function expensiveOperation() { for(let i = 0; i < 1000000; i++) { ctx.fillStyle = 'rgba(0,0,255, 0.2)'; ctx.beginPath(); @@ -102,24 +102,24 @@ alertBtn.addEventListener('click', () =>Под потоком, обычно, понимают одиночный процесс, который может использовать программа, для выполнения своих нужд. Каждый поток может выполнять только одну в текущий момент времени:
-Task A --> Task B --> Task C+Task A --> Task B --> Task CКаждая задача будет выполнена последовательно; только когда текущая задача завершится, следующая сможет начаться.
Как мы говорили выше, большинство компьютеров теперь имеют процессор с несколькими ядрами, т.е. могут выполнять несколько задач одновременно. Языки программирования, поддерживающие многопоточность, могут использовать несколько ядер, чтобы выполнять несколько задач одновременно:
-Thread 1: Task A --> Task B +Thread 1: Task A --> Task B Thread 2: Task C --> Task DJavaScript однопоточный
JavaScript, традиционно для скриптовых языков, однопоточный. Даже, если есть несколько ядер, вы можете использовать их только для выполнения задач в одном потоке, называемом основной поток. Наш пример выше, выполняется следующим образом:
-Main thread: Render circles to canvas --> Display alert()+Main thread: Render circles to canvas --> Display alert()В итоге, JavaScript получил несколько инструментов, которые могут помочь в решении подобных проблем. Web workers позволяют вам обработать некоторый JavaScript-код в отдельном потоке, который называется обработчик, таким образом вы можете запускать отдельные блоки JavaScript-кода одновременно. В основном, вы будете использовать воркеры, чтобы запустить ресурсоёмкий процесс, отдельно от основного потока, чтобы не блокировать действия пользователя.
-Main thread: Task A --> Task C +Main thread: Task A --> Task C Worker thread: Expensive task BПомня об этом, выполните наш следующий пример simple-sync-worker.html (посмотреть пример в действии), с открытой консолью. Это переписанный предыдущий пример, который теперь рассчитывает 10 миллионов дат в отдельном потоке обработчика. Теперь, когда вы нажимаете на кнопку, браузер может добавить новый элемент на страницу, до того как все даты будут посчитаны. Самая первая операция больше не блокирует выполнение следующей.
@@ -130,18 +130,18 @@ Worker thread: Expensive task BСледующая проблема заключается в том, что даже если код запущенный в воркере ничего не блокирует, он в целом остаётся синхронным. Это проблема появляется, когда какой-то функции требуются результаты выполнения нескольких предыдущих функций. Рассмотрим следующую диаграмму потоков:
-Main thread: Task A --> Task B+Main thread: Task A --> Task BВ этом примере, предположим Task A делает что-то вроде получения картинки с сервера а Task B затем делает что-нибудь с полученной картинкой, например, применяет к ней фильтр. Если запустить выполняться Task A и тут же попытаться выполнить Task B, то вы получите ошибку, поскольку картинка ещё не будет доступна.
-Main thread: Task A --> Task B --> |Task D| +Main thread: Task A --> Task B --> |Task D| Worker thread: Task C -----------> | |Теперь, давайте предположим, что Task D использует результат выполнения обеих задач Task B и Task C. Если мы уверенны, что оба результата будут доступны одновременно, тогда не возникнет проблем, однако, часто это не так. Если Task D попытаться запустить, когда какого-то нужного ей результата ещё нет, выполнение закончится ошибкой.
Чтобы избежать подобных проблем, браузеры позволяют нам выполнять определённые операции асинхронно. Такие возможности, как Promises позволяют запустить некоторую операцию (например, получение картинки с сервера), и затем подождать пока операция не вернёт результат, перед тем как начать выполнение другой задачи:
-Main thread: Task A Task B +Main thread: Task A Task B Promise: |__async operation__|Поскольку операция выполняется где-то отдельно, основной поток не блокируется, при выполнении асинхронных задач.
diff --git a/files/ru/learn/javascript/asynchronous/introducing/index.html b/files/ru/learn/javascript/asynchronous/introducing/index.html index 2d457b6888..0b53770834 100644 --- a/files/ru/learn/javascript/asynchronous/introducing/index.html +++ b/files/ru/learn/javascript/asynchronous/introducing/index.html @@ -36,7 +36,7 @@ translation_of: Learn/JavaScript/Asynchronous/IntroducingБольшая часть функциональности, которую мы рассматривали в предыдущих обучающих модулях, является синхронной — вы запускаете какой-то код, а результат возвращается, как только браузер может его вернуть. Давайте рассмотрим простой пример ( посмотрите онлайн, как это работает и посмотрите исходный код):
-const btn = document.querySelector('button'); +const btn = document.querySelector('button'); btn.addEventListener('click', () => { alert('You clicked me!'); @@ -65,7 +65,7 @@ btn.addEventListener('click', () => {Так и в примере выше: после нажатия кнопки абзац не сможет появиться пока не будет нажата кнопка OK в окне сообщения. Попробуйте сами:
-<button>Нажми меня</button>+<button>Нажми меня</button>{{EmbedLiveSample('Синхронный_JavaScript', '100%', '70px')}}
@@ -80,7 +80,7 @@ btn.addEventListener('click', () => {Почему трудно работать, используя синхронный код? Давайте посмотрим на небольшой пример. Когда вы получаете картинку с сервера, вы не можете мгновенно вернуть результат. Это значит что следующий (псевдо) код не сработает:
-let response = fetch('myImage.png'); +let response = fetch('myImage.png'); let blob = response.blob(); // display your image blob in the UI somehow@@ -94,7 +94,7 @@ let blob = response.blob();Пример асинхронного колбэка вторым параметром {{domxref("EventTarget.addEventListener", "addEventListener()")}} (как мы видели выше):
-btn.addEventListener('click', () => { +btn.addEventListener('click', () => { alert('You clicked me!'); let pElem = document.createElement('p'); @@ -108,7 +108,7 @@ let blob = response.blob();Вы можете написать свою собственную функцию, содержащую колбэк-функцию. Давайте взглянем на ещё один пример, в котором происходит загрузка ресурсов через
-XMLHttpRequest
API (запустите пример, и посмотрите исходный код):function loadAsset(url, type, callback) { +function loadAsset(url, type, callback) { let xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.responseType = type; @@ -136,7 +136,7 @@ loadAsset('coffee.jpg', 'blob', displayImage);Заметьте, что не все колбэк-функции асинхронны — некоторые запускаются синхронно. Например, при использовании {{jsxref("Array.prototype.forEach()")}} для перебора элементов массива (запустите пример, и посмотрите исходный код):
-const gods = ['Apollo', 'Artemis', 'Ares', 'Zeus']; +const gods = ['Apollo', 'Artemis', 'Ares', 'Zeus']; gods.forEach(function (eachName, index){ console.log(index + '. ' + eachName); @@ -148,7 +148,7 @@ gods.forEach(function (eachName, index){Промисы — новый стиль написания асинхронного кода, который используется в современных Web API. Хорошим примером является
-fetch()
API, который современнее и эффективнее чем {{domxref("XMLHttpRequest")}}. Посмотрим на краткий пример, из нашей статьи Fetching data from the server:fetch('products.json').then(function(response) { +fetch('products.json').then(function(response) { return response.json(); }).then(function(json) { products = json; @@ -195,7 +195,7 @@ gods.forEach(function (eachName, index){Давайте рассмотрим пример, который дополнительно иллюстрирует природу асинхронного кода, показывая, что может произойти, когда мы не полностью осознаем порядок выполнения кода, и проблемы, связанные с попыткой трактовать асинхронный код как синхронный. Следующий пример довольно похож на тот, что мы видели раньше (запустите пример, и посмотреть исходный код). Одно из отличий состоит в том, что мы включили ряд операторов {{domxref("console.log()")}} чтобы проиллюстрировать порядок, в котором, как вы думаете, будет выполняться код.
-console.log ('Starting'); +console.log ('Starting'); let image; fetch('coffee.jpg').then((response) => { @@ -226,7 +226,7 @@ console.log ('All done!');Если вы запутались, рассмотрим следующий небольшой пример:
-console.log("registering click handler"); +console.log("registering click handler"); button.addEventListener('click', () => { console.log("get click"); @@ -240,11 +240,11 @@ console.log("all done");Чтобы увидеть это в действии, попробуйте взять локальную копию нашего примера и измените третий вызов
-console.log ()
следующим образом:console.log ('All done! ' + image + 'displayed.');+console.log ('All done! ' + image + 'displayed.');Теперь вместо третьего сообщения должна возникнуть следующая ошибка:
-+
Это происходит потому, что в то же время браузер пытается запустить третий
diff --git a/files/ru/learn/javascript/asynchronous/timeouts_and_intervals/index.html b/files/ru/learn/javascript/asynchronous/timeouts_and_intervals/index.html index 8d00ba98af..19019a19a9 100644 --- a/files/ru/learn/javascript/asynchronous/timeouts_and_intervals/index.html +++ b/files/ru/learn/javascript/asynchronous/timeouts_and_intervals/index.html @@ -64,13 +64,13 @@ original_slug: Learn/JavaScript/Asynchronous/Таймауты_и_интерваconsole.log()
, блокfetch()
ещё не закончил выполнение, поэтому переменнаяimage
ещё не имеет значения.В следующем примере, браузер будет ожидать две секунды перед тем как выполнит анонимную функцию, тогда отобразит сообщение (живой пример, и исходный код):
-let myGreeting = setTimeout(function() { +let myGreeting = setTimeout(function() { alert('Hello, Mr. Universe!'); }, 2000)Указанные вами функции не обязательно должны быть анонимными. Вы можете дать своей функции имя и даже определить её где-нибудь ещё и передать ссылку на функцию в setTimeout (). Следующие две версии фрагмента кода эквивалентны первой:
-// С именованной функцией +// С именованной функцией let myGreeting = setTimeout(function sayHi() { alert('Hello, Mr. Universe!'); }, 2000) @@ -92,19 +92,19 @@ let myGreeting = setTimeout(sayHi, 2000);Например, вы можете реорганизовать предыдущую функцию, чтобы она передавала привет любому имени, переданному ей:
-function sayHi(who) { +function sayHi(who) { alert(`Hello ${who}!`); }Теперь вы можете передать имя в вызов setTimeout () в качестве третьего параметра:
-let myGreeting = setTimeout(sayHi, 2000, 'Mr. Universe');+let myGreeting = setTimeout(sayHi, 2000, 'Mr. Universe');Очистка таймаутов
Наконец, если был создан тайм-аут, вы можете отменить его до истечения указанного времени, вызвав
-clearTimeout()
, передав ему идентификатор вызоваsetTimeout()
в качестве параметра. Итак, чтобы отменить указанный выше тайм-аут, вы должны сделать следующее:clearTimeout(myGreeting);+clearTimeout(myGreeting);Note: См.
@@ -118,7 +118,7 @@ let myGreeting = setTimeout(sayHi, 2000);greeter-app.html
для более полной демонстрации, которая позволяет вам указать имя для приветствия и отменить приветствие с помощью отдельной кнопки (см. исходный код).Давайте посмотрим на пример. Следующая функция создаёт новый объект
-Date()
, с помощьюtoLocaleTimeString()
извлекает из него строку с временем и отображает её в пользовательском интерфейсе. Затем он запускает функцию один раз в секунду с помощьюsetInterval()
, создавая эффект цифровых часов, которые обновляются раз в секунду ( реальный пример, и исходный код):function displayTime() { +function displayTime() { let date = new Date(); let time = date.toLocaleTimeString(); document.getElementById('demo').textContent = time; @@ -132,7 +132,7 @@ const createClock = setInterval(displayTime, 1000);-
setInterval ()
выполняет задачу постоянно. setInterval () продолжает выполнять задачу вечно, если вы что-то с ней не сделаете. Возможно, вам понадобится способ остановить такие задачи, иначе вы можете получить ошибки, если браузер не сможет выполнить какие-либо другие версии задачи или если анимация, обрабатываемая задачей, завершилась. Вы можете сделать это так же, как останавливаетеtimeouts
- передавая идентификатор, возвращаемый вызовомsetInterval ()
, в функциюclearInterval ()
:const myInterval = setInterval(myFunction, 2000); +const myInterval = setInterval(myFunction, 2000); clearInterval(myInterval);@@ -182,7 +182,7 @@ clearInterval(myInterval);В приведённом ниже примере используется рекурсивный setTimeout () для запуска переданной функции каждые 100 миллисекунд:
-let i = 1; +let i = 1; setTimeout(function run() { console.log(i); @@ -192,7 +192,7 @@ setTimeout(function run() {Сравните приведённый выше пример со следующим - здесь используется
-setInterval ()
для достижения того же эффекта:let i = 1; +let i = 1; setInterval(function run() { console.log(i); @@ -217,7 +217,7 @@ setInterval(function run() {Например, код приведённый ниже (рабочий код) выводит alert содержащий
-"Hello"
, затем alert содержащий"World"
как только вы нажмёте ОК в первом alert.setTimeout(function() { +setTimeout(function() { alert('World'); }, 0); @@ -243,7 +243,7 @@ alert('Hello');Метод принимает в качестве аргумента колбэк, который должен быть вызван перед перерисовкой. Это общий шаблон, в котором он используется:
-function draw() { +function draw() { // Drawing code goes here requestAnimationFrame(draw); } @@ -272,7 +272,7 @@ draw();Давайте поговорим ещё немного о том, чем метод
-requestAnimationFrame ()
отличается от других методов, используемых ранее. Глядя на наш код сверху:function draw() { +function draw() { // Drawing code goes here requestAnimationFrame(draw); } @@ -281,7 +281,7 @@ draw();Такой же код с использованием
-setInterval()
:function draw() { +function draw() { // Drawing code goes here } @@ -297,7 +297,7 @@ setInterval(draw, 17);Это полезно, поскольку позволяет запускать вещи в определённое время и в постоянном темпе, независимо от того, насколько быстрым или медленным может быть ваше устройство. Общий шаблон, который вы бы использовали, выглядит примерно так:
-let startTime = null; +let startTime = null; function draw(timestamp) { if (!startTime) { @@ -337,7 +337,7 @@ draw();Примените следующий CSS к HTML шаблону (любым предпочитаемым способом). Он установ красный фон на странице, высоту
-<body>
равную100%
высоты {{htmlelement("html")}} , и центрирует<div>
внутри<body>
, по горизонтали и вертикали.html { +html { background-color: white; height: 100%; } @@ -362,7 +362,7 @@ div {Разместите следующий JavaScript-код в
-<script>
. Здесь вы сохраняете ссылку на<div>
внутри, устанавливаете для переменнойrotateCount
значение0
, устанавливаете неинициализированную переменную, которая позже будет использоваться для хранения ссылки на вызовrequestAnimationFrame()
, и устанавливаете для переменнойstartTime
значениеnull
, которая будет позже использоваться для хранения времени началаrequestAnimationFrame()
.const spinner = document.querySelector('div'); +const spinner = document.querySelector('div'); let rotateCount = 0; let startTime = null; let rAF; @@ -371,14 +371,14 @@ let rAF;Под предыдущим кодом вставьте функцию
-draw()
которая будет использоваться для хранения нашего кода анимации, который включает параметрtimestamp
:function draw(timestamp) { +function draw(timestamp) { }Внутри
-draw ()
добавьте следующие строки. Они определят время начала, если оно ещё не определено (это произойдёт только на первой итерации цикла), и установят для параметраrotateCount
значение для поворота счётчика (текущая временная метка, возьмите начальную временную метку, разделённую на три, чтобы замедлиться):if (!startTime) { +if (!startTime) { startTime = timestamp; } @@ -388,22 +388,22 @@ let rAF;Под предыдущей строкой внутри
-draw ()
добавьте следующий блок - он проверяет, превышает ли значениеrotateCount 359
(например,360
, полный круг). Если это так, он устанавливает значение по модулю360
(то есть остаток, оставшийся после деления значения на360
), поэтому круговая анимация может продолжаться непрерывно с разумным низким значением. Обратите внимание, что это не является строго необходимым, но легче работать со значениями от 0 до359
градусов, чем со значениями типа «128000
градусов».if (rotateCount > 359) { +if (rotateCount > 359) { rotateCount %= 360; }Затем, под предыдущим блоком, добавьте следующую строку, чтобы вращать spinner: - spinner.style.transform = `rotate(${rotateCount}deg)`;+spinner.style.transform = `rotate(${rotateCount}deg)`;В самом низу внутри функции draw () вставьте следующую строку. Это ключ ко всей операции - вы устанавливаете для переменной, определённой ранее, активный вызов requestAnimation (), который принимает функцию draw () в качестве своего параметра. Это запускает анимацию, постоянно выполняя функцию draw () со скоростью, близкой к 60 FPS.
-rAF = requestAnimationFrame(draw);+rAF = requestAnimationFrame(draw);@@ -417,7 +417,7 @@ let rAF; Ниже, вызовите функцию
-draw()
для запуска анимации.draw();+draw();Просто передайте ему значение, возвращаемое вызовом requestAnimationFrame () для отмены, которое вы сохранили в переменной rAF:
-cancelAnimationFrame(rAF);+cancelAnimationFrame(rAF);Активное обучение: запуск и остановка нашей анимации
@@ -444,7 +444,7 @@ let rAF;В этом примере вы должны анимировать как положение персонажа на экране, так и отображаемый спрайт. В анимации спрайта всего 6 кадров. Если бы вы показывали разные кадры спрайта для каждого кадра, отображаемого на экране, с помощью requestAnimationFrame (), Guybrush двигал бы конечностями слишком быстро, и анимация выглядела бы нелепо. Следовательно, в этом примере регулируется скорость, с которой спрайт циклически повторяет свои кадры, используя следующий код:
-if (posX % 13 === 0) { +if (posX % 13 === 0) { if (sprite === 5) { sprite = 0; } else { @@ -456,7 +456,7 @@ let rAF;... Фактически, это примерно каждые 6,5 кадров, поскольку мы обновляем posX (положение персонажа на экране) на два кадра:
-if (posX > width/2) { +if (posX > width/2) { newStartPos = -( (width/2) + 102 ); posX = Math.ceil(newStartPos / 13) * 13; console.log(posX); @@ -485,7 +485,7 @@ let rAF;Внутри пустого элемента {{htmlelement("script")}} на вашей странице, начните с добавления следующих строк кода, которые определяют некоторые переменные и константы, которые вам понадобятся в дальнейшем:
-const spinner = document.querySelector('.spinner p'); +const spinner = document.querySelector('.spinner p'); const spinnerContainer = document.querySelector('.spinner'); let rotateCount = 0; let startTime = null; @@ -508,7 +508,7 @@ const result = document.querySelector('.result');Ниже добавьте следующую функцию. Она просто берёт два числа и возвращает случайное число между ними. Это понадобится вам позже, чтобы сгенерировать случайный интервал ожидания.
-function random(min,max) { +function random(min,max) { var num = Math.floor(Math.random()*(max-min)) + min; return num; }@@ -516,7 +516,7 @@ const result = document.querySelector('.result');Затем добавьте функцию draw(), которая анимирует спиннер. Это очень похоже на версию из предыдущего примера простого счётчика:
-function draw(timestamp) { +function draw(timestamp) { if(!startTime) { startTime = timestamp; } @@ -534,13 +534,13 @@ const result = document.querySelector('.result');Теперь пришло время настроить начальное состояние приложения при первой загрузке страницы. Добавьте следующие две строки, которые просто скрывают абзац результатов и контейнер счётчика с помощью
-display: none
;.result.style.display = 'none'; +result.style.display = 'none'; spinnerContainer.style.display = 'none';Затем определите функцию
-reset ()
, которая возвращает приложение в исходное состояние, необходимое для повторного запуска игры после её завершения. Добавьте в конец кода следующее:function reset() { +function reset() { btn.style.display = 'block'; result.textContent = ''; result.style.display = 'none'; @@ -549,7 +549,7 @@ spinnerContainer.style.display = 'none';Хорошо, хватит подготовки! Пришло время сделать игру доступной! Добавьте в свой код следующий блок. Функция
-start ()
вызываетdraw ()
, чтобы запустить вращение спиннера и отобразить его в пользовательском интерфейсе, скрыть кнопку Start, чтобы вы не могли испортить игру, запустив её несколько раз одновременно, и запускает вызовsetTimeout ()
, который выполняется функцияsetEndgame ()
по прошествии случайного интервала от 5 до 10 секунд. Следующий блок также добавляет обработчик событий к вашей кнопке для запуска функцииstart ()
при её нажатии.btn.addEventListener('click', start); +btn.addEventListener('click', start); function start() { draw(); @@ -569,7 +569,7 @@ function start() {Добавьте в свой код следующую функцию:
-function setEndgame() { +function setEndgame() { cancelAnimationFrame(rAF); spinnerContainer.style.display = 'none'; result.style.display = 'block'; diff --git a/files/ru/learn/javascript/building_blocks/conditionals/index.html b/files/ru/learn/javascript/building_blocks/conditionals/index.html index 6f0b70c1bf..868702ca03 100644 --- a/files/ru/learn/javascript/building_blocks/conditionals/index.html +++ b/files/ru/learn/javascript/building_blocks/conditionals/index.html @@ -46,7 +46,7 @@ translation_of: Learn/JavaScript/Building_blocks/conditionalsБазовый
-if...else
синтаксис выглядит как {{glossary("pseudocode")}}:if (condition) { +if (condition) { code to run if condition is true } else { run some other code instead @@ -66,7 +66,7 @@ translation_of: Learn/JavaScript/Building_blocks/conditionalsСтоит заметить, что
-else
и второй блок скобок { } не обязателен — следующий код так же будет работать:if (condition) { +if (condition) { код, который должен выполнить, если условие истина } @@ -76,7 +76,7 @@ translation_of: Learn/JavaScript/Building_blocks/conditionalsИ, наконец, иногда вы можете встретить код
-if...else
без фигурных скобок в сокращённой форме:if (condition) code to run if condition is true +if (condition) code to run if condition is true else run some other code insteadЭто абсолютно рабочий код, но он менее читаем, лучше использовать фигурные скобки, новые строки и отступы.
@@ -85,7 +85,7 @@ else run some other code insteadЧтобы лучше понять синтаксис, давайте рассмотрим реальный пример. Представьте, что мать или отец попросили помочь с работой по дому своего ребёнка. Родитель может сказать: "Если ты поможешь мне с покупками, то я дам тебе дополнительные деньги на карманные расходы, которые ты сможешь потратить на игрушку, какую захочешь". В JavaScript, мы можем представить это так:
-var shoppingDone = false; +var shoppingDone = false; if (shoppingDone === true) { var childsAllowance = 10; @@ -105,7 +105,7 @@ if (shoppingDone === true) {Существует способ привязать дополнительные варианты/результаты к вашему
-if...else
— использоватьelse if
. Для каждого дополнительного выбора требуется дополнительный блок, который нужно расположить междуif() { ... }
иelse { ... }
— проверьте следующий более сложный пример, который может быть частью простого приложения прогноза погоды:<label for="weather">Выберите тип погоды сегодня: </label> +<label for="weather">Выберите тип погоды сегодня: </label> <select id="weather"> <option value="">--Сделайте выбор--</option> <option value="sunny">Солнечно</option> @@ -116,7 +116,7 @@ if (shoppingDone === true) { <p></p>-var select = document.querySelector('select'); +var select = document.querySelector('select'); var para = document.querySelector('p'); select.addEventListener('change', setWeather); @@ -168,7 +168,7 @@ function setWeather() {Мы хотели бы особо обратить внимание на проверку булевых значений (
-true
/false
), и общий шаблон, который вы будете встречать снова и снова. Любое значение, которое не естьfalse
,undefined
,null
,0
,NaN
, или пустая строка (''
) фактически возвращаетtrue
при тестировании как условного оператора. Поэтому вы можете просто использовать имя собственной переменной, чтобы проверить, равна ли онаtrue
, или существует (т. е. переменная не равна undefined). Например:var cheese = 'Cheddar'; +var cheese = 'Cheddar'; if (cheese) { console.log('Ура! Есть сыр для приготовления бутерброда.'); @@ -178,7 +178,7 @@ if (cheese) {И, возвращаясь к нашему предыдущему примеру о ребёнке, выполняющем поручение своего родителя, вы можете это записать так:
-var shoppingDone = false; +var shoppingDone = false; if (shoppingDone) { // не нужно явно указывать '=== true' var childsAllowance = 10; @@ -190,7 +190,7 @@ if (shoppingDone) { // не нужно явно указывать '=== true'Вполне нормально использовать один условный оператор
-if...else
внутри другого — вложить их. Например, мы могли бы обновить наше приложение прогноза погоды, чтобы показать ещё один набор вариантов в зависимости от температуры:if (choice === 'sunny') { +if (choice === 'sunny') { if (temperature < 86) { para.textContent = 'Сейчас ' + temperature + ' градусов по фаренгейту — хорошо и солнечно. Идите на пляж, или в парк, и купите мороженое.'; } else if (temperature >= 86) { @@ -211,7 +211,7 @@ if (shoppingDone) { // не нужно явно указывать '=== true'Чтобы дать вам пример оператора И, предыдущий фрагмент кода можно переписать так:
-if (choice === 'sunny' && temperature < 86) { +if (choice === 'sunny' && temperature < 86) { para.textContent = 'Сейчас ' + temperature + ' градусов по фаренгейту — хорошо и солнечно. Идите на пляж, или в парк, и купите мороженое.'; } else if (choice === 'sunny' && temperature >= 86) { para.textContent = 'Сейчас ' + temperature + ' градусов по фаренгейту — Жара! Если вы хотите выйти на улицу, обязательно используйте солнцезащитный крем.'; @@ -221,7 +221,7 @@ if (shoppingDone) { // не нужно явно указывать '=== true'Давайте посмотрим на быстрый пример оператора ИЛИ:
-if (iceCreamVanOutside || houseStatus === 'в огне') { +if (iceCreamVanOutside || houseStatus === 'в огне') { //если подъехал фургон с мороженым или дом горит console.log('Вы должны быстро покинуть дом.'); } else { @@ -230,7 +230,7 @@ if (shoppingDone) { // не нужно явно указывать '=== true'Последний тип логического оператора НЕ, выраженный
-!
оператором, можно использовать для отрицания выражения. Давайте объединим его с ИЛИ в приведённом выше примере:if (!(iceCreamVanOutside || houseStatus === 'on fire')) { +if (!(iceCreamVanOutside || houseStatus === 'on fire')) { console.log('Вероятно, можно в нем оставаться.'); } else { console.log('Вы должны быстро покинуть дом.'); @@ -240,19 +240,19 @@ if (shoppingDone) { // не нужно явно указывать '=== true'Можно сочетать любое количество логических операторов, в любой последовательности и в любой комбинации. В следующем примере код в блоке будет выполняться только в том случае, если оба условия с ИЛИ возвращают true, а следовательно, и оператор И возвращает true:
-if ((x === 5 || y > 3 || z <= 10) && (loggedIn || userName === 'Steve')) { +if ((x === 5 || y > 3 || z <= 10) && (loggedIn || userName === 'Steve')) { // код выполняется }Распространённой ошибкой при использовании логического оператора ИЛИ в условном выражении является указание переменной, значение которой нужно проверить со списком возможных значений этой переменной, разделённых операторами
-||
(ИЛИ). Например.if (x === 5 || 7 || 10 || 20) { +if (x === 5 || 7 || 10 || 20) { // выполнить код }В данном примере условие в
-if(...)
всегда будет оцениваться как true, поскольку 7 (или любое другое ненулевое значение) всегда будет оцениваться как true. Фактически, это условие гласит «если х равен 5, или 7 является true». Но нам требуется совсем не это. Чтобы достичь нужной цели, придётся выполнять полноценную проверку после каждого оператора ИЛИ:if (x === 5 || x === 7 || x === 10 ||x === 20) { +if (x === 5 || x === 7 || x === 10 ||x === 20) { // выполнить код }@@ -262,7 +262,7 @@ if (shoppingDone) { // не нужно явно указывать '=== true'В этом случае нам поможет оператор
-switch
– он принимает одно единственное выражение или значение, а затем просматривает ряд вариантов, пока не найдут вариант, соответствующий этому значению, после чего выполняет код, назначенный этому варианту. Вот пример использования этого оператора:switch (выражение) { +switch (выражение) { case choice1: выполнить этот код break; @@ -297,7 +297,7 @@ if (shoppingDone) { // не нужно явно указывать '=== true'Давайте рассмотрим реальный пример — перепишем наше приложение прогноза погоды с использованием оператора switch:
-<label for="weather">Выберите тип погоды сегодня: </label> +<label for="weather">Выберите тип погоды сегодня: </label> <select id="weather"> <option value="">--Сделайте выбор--</option> <option value="sunny">Солнечно</option> @@ -308,7 +308,7 @@ if (shoppingDone) { // не нужно явно указывать '=== true' <p></p>-var select = document.querySelector('select'); +var select = document.querySelector('select'); var para = document.querySelector('p'); select.addEventListener('change', setWeather); @@ -345,11 +345,11 @@ function setWeather() {Это последний теоретический раздел данной статьи и мы перейдём к практическим упражнениям. Тернарный или условный оператор имеет простой синтаксис: он проверяет условие и возвращает одно значение или выражение, если условие является
-true
, и другое значение/выражение, если условие являетсяfalse
. Часто это очень удобная альтернатива блокуif...else
, позволяющая затрачивать меньшие усилия на написание кода, когда имеется всего лишь два варианта, выбираемых на основе условияtrue
/false
. Общая схема оператора:( условие) ? выполнить этот код : выполнить этот код вместо первого+( условие) ? выполнить этот код : выполнить этот код вместо первогоПриведём простой пример:
-var greeting = ( isBirthday ) ? 'С днём рождения, г-н Кузнецов! Хорошо вам повеселиться!' : 'Доброе утро, г-н Кузнецов.';+var greeting = ( isBirthday ) ? 'С днём рождения, г-н Кузнецов! Хорошо вам повеселиться!' : 'Доброе утро, г-н Кузнецов.';У нас есть переменная
@@ -357,7 +357,7 @@ function setWeather() {isBirthday
, если онаtrue
, мы отправляем посетителю поздравление с днём рождения; если нет – выдаём стандартное приветствие.При использовании тернарного оператора не обязательно ограничиваться лишь значениями переменной, можно выполнять функции или строки кода; все, что угодно. В следующем примере показано простое средство выбора темы, задающее внешний вид веб-сайта с помощью тернарного оператора.
-<label for="theme">Выберите тему: </label> +<label for="theme">Выберите тему: </label> <select id="theme"> <option value="white">Белая</option> <option value="black">Чёрная</option> @@ -365,7 +365,7 @@ function setWeather() { <h1>Это мой веб-сайт</h1>-var select = document.querySelector('select'); +var select = document.querySelector('select'); var html = document.querySelector('html'); document.body.style.padding = '10px'; @@ -422,7 +422,7 @@ select.onchange = function() {Playable code
-<h2>Live output</h2> +<h2>Live output</h2> <div class="output" style="height: 500px;overflow: auto;"> <label for="month">Выберите месяц: </label> <select id="month"> @@ -477,7 +477,7 @@ createCalendar(31,'Январь'); <input id="solution" type="button" value="Показать решение"> </div>-.output * { +.output * { box-sizing: border-box; } @@ -516,7 +516,7 @@ body { background: #f5f9fa; }-var textarea = document.getElementById('code'); +var textarea = document.getElementById('code'); var reset = document.getElementById('reset'); var solution = document.getElementById('solution'); var code = textarea.value; @@ -611,7 +611,7 @@ textarea.onkeyup = function(){Playable code 2
-<div class="output" style="height: 300px;"> +<div class="output" style="height: 300px;"> <label for="theme">Выберите тему: </label> <select id="theme"> <option value="white">Белая</option> @@ -647,7 +647,7 @@ function update(bgColor, textColor) { </div>-var textarea = document.getElementById('code'); +var textarea = document.getElementById('code'); var reset = document.getElementById('reset'); var solution = document.getElementById('solution'); var code = textarea.value; diff --git a/files/ru/learn/javascript/building_blocks/events/index.html b/files/ru/learn/javascript/building_blocks/events/index.html index 787df877f9..2813a966d0 100644 --- a/files/ru/learn/javascript/building_blocks/events/index.html +++ b/files/ru/learn/javascript/building_blocks/events/index.html @@ -58,15 +58,15 @@ original_slug: Learn/JavaScript/Building_blocks/СобытияРассмотрим простой пример. Вы уже видели события и обработчики событий во многих примерах в этом курсе, но давайте повторим для закрепления информации. В этом примере у нас есть кнопка {{htmlelement ("button")}}, при нажатии которой цвет фона изменяется случайным образом:
-<button>Change color</button>+<button>Change color</button>-button { margin: 10px };+button { margin: 10px };JavaScript выглядит так:
-const btn = document.querySelector('button'); +const btn = document.querySelector('button'); function random(number) { return Math.floor(Math.random() * (number+1)); @@ -103,7 +103,7 @@ btn.onclick = function() {В этом курсе вы уже сталкивались со свойствами, связываемыми с алгоритмом работы обработчика событий. Вернёмся к приведённому выше примеру:
-const btn = document.querySelector('button'); +const btn = document.querySelector('button'); btn.onclick = function() { var rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')'; @@ -114,7 +114,7 @@ btn.onclick = function() {Для получения того же результата, вы также можете присвоить свойству обработчика имя уже описанной функции (как мы видели в статье Создайте свою функцию):
-const btn = document.querySelector('button'); +const btn = document.querySelector('button'); function bgChange() { const rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')'; @@ -140,10 +140,10 @@ btn.onclick = bgChange;Самый ранний из введённых в сеть Web методов регистрации обработчиков событий базируется на HTML атрибутах (встроенные обработчики событий):
-<button onclick="bgChange()">Press me</button> +<button onclick="bgChange()">Press me</button>-function bgChange() { +function bgChange() { const rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')'; document.body.style.backgroundColor = rndCol; }@@ -154,7 +154,7 @@ btn.onclick = bgChange;Значение атрибута — это буквально код JavaScript, который вы хотите запустить при возникновении события. В приведённом выше примере вызывается функция, определённая внутри элемента {{htmlelement ("script")}} на той же странице, но вы также можете вставить JavaScript непосредственно внутри атрибута, например:
-<button onclick="alert('Hello, this is my old-fashioned event handler!');">Press me</button>+<button onclick="alert('Hello, this is my old-fashioned event handler!');">Press me</button>Для многих свойств обработчика событий существуют эквиваленты в виде атрибутов HTML. Однако, не рекомендуется их использовать — это считается плохой практикой. Использование атрибутов для регистрации обработчика событий кажется простым и быстрым методом, но такое описание обработчиков также скоро становится неудобным и неэффективным.
@@ -164,7 +164,7 @@ btn.onclick = bgChange;Например:
-const buttons = document.querySelectorAll('button'); +const buttons = document.querySelectorAll('button'); for (var i = 0; i < buttons.length; i++) { buttons[i].onclick = bgChange; @@ -172,7 +172,7 @@ for (var i = 0; i < buttons.length; i++) {Обратите внимание, что для перебора всех элементов, которые содержит объект
-NodeList
, можно воспользоваться встроенным методомforEach()
:buttons.forEach(function(button) { +buttons.forEach(function(button) { button.onclick = bgChange; });@@ -184,7 +184,7 @@ for (var i = 0; i < buttons.length; i++) {Новый тип механизма событий определён в спецификации Document Object Model (DOM) Level 2 Events, которая предоставляет браузеру новую функцию —
-addEventListener()
. Работает она аналогично свойствам обработчика событий, но синтаксис совсем другой. Наш пример со случайным цветом мог бы выглядеть и так:var btn = document.querySelector('button'); +var btn = document.querySelector('button'); function bgChange() { var rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')'; @@ -199,25 +199,25 @@ btn.addEventListener('click', bgChange);Внутри функции
-addEventListener()
мы указываем два параметра — имя события, для которого мы хотим зарегистрировать этот обработчик, и код, содержащий функцию обработчика, которую мы хотим запустить в ответ. Обратите внимание, что будет целесообразно поместить весь код внутри функцииaddEventListener()
в анонимную функцию, например:btn.addEventListener('click', function() { +btn.addEventListener('click', function() { var rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')'; document.body.style.backgroundColor = rndCol; });Этот механизм имеет некоторые преимущества по сравнению с более старыми механизмами, рассмотренными ранее. Например, существует аналогичная функция
-removeEventListener()
, которая удаляет ранее добавленный обработчик. Это приведёт к удалению набора обработчиков в первом блоке кода в этом разделе:btn.removeEventListener('click', bgChange);+btn.removeEventListener('click', bgChange);Это не важно для простых небольших программ, но для более крупных и более сложных программ он может повысить эффективность очистки старых неиспользуемых обработчиков событий. Кроме того, это позволяет вам иметь одну и ту же кнопку, выполняющую различные действия в разных обстоятельствах — все, что вам нужно сделать, это добавить/удалить обработчики событий, если это необходимо.
Также вы можете зарегистрировать несколько обработчиков для одного и того же события на элементе. Следующие два обработчика не будут применяться:
-myElement.onclick = functionA; +myElement.onclick = functionA; myElement.onclick = functionB;Поскольку вторая строка будет перезаписывать значение
-onclick
, установленное первой. Однако, если:myElement.addEventListener('click', functionA); +myElement.addEventListener('click', functionA); myElement.addEventListener('click', functionB);Обе функции будут выполняться при щелчке элемента.
@@ -237,7 +237,7 @@ myElement.addEventListener('click', functionB);Основные преимущества третьего механизма заключаются в том, что при необходимости можно удалить код обработчика событий, используя
-removeEventListener()
, и так же можно добавить несколько элементов-обработчиков того же типа к элементам. Например, вы можете вызватьaddEventListener('click', function() {...})
для элемента несколько раз, с разными функциями, указанными во втором аргументе. Это невозможно при использовании свойств обработчика событий, поскольку любые последующие попытки установить свойство будут перезаписывать более ранние, например:element.onclick = function1; +element.onclick = function1; element.onclick = function2; etc.@@ -253,7 +253,7 @@ etc.Иногда внутри функции обработчика событий вы можете увидеть параметр, заданный с таким именем, как
-event
,evt
или простоe
. Называется он объектом события и он автоматически передаётся обработчикам событий для предоставления дополнительных функций и информации. Например, давайте немного перепишем наш пример со случайным цветом:function bgChange(e) { +function bgChange(e) { var rndCol = 'rgb(' + random(255) + ',' + random(255) + ',' + random(255) + ')'; e.target.style.backgroundColor = rndCol; console.log(e); @@ -273,7 +273,7 @@ btn.addEventListener('click', bgChange);-
e.target
применяют, когда нужно установить один и тот же обработчик событий на несколько элементов и, когда на них происходит событие, применить определённое действие к ним ко всем. Например, у вас может быть набор из 16 плиток, которые исчезают при нажатии. Полезно всегда иметь возможность просто указать, чтобы объект исчез, какe.target
, вместо того, чтобы выбирать его более сложным способом. В следующем примере (см. исходный код на useful-eventtarget.html,а как он работает можно посмотреть здесь), мы создаём 16 элементов {{htmlelement ("div")}} с использованием JavaScript. Затем мы выберем все из них, используя {{domxref ("document.querySelectorAll()")}}, и с помощью циклаfor
выберем каждый из них, добавив обработчикonclick
к каждому так, чтобы случайный цвет применялся к каждому клику:var divs = document.querySelectorAll('div'); +var divs = document.querySelectorAll('div'); for (var i = 0; i < divs.length; i++) { divs[i].onclick = function(e) { @@ -286,7 +286,7 @@ for (var i = 0; i < divs.length; i++) {Hidden example
-<!DOCTYPE html> +<!DOCTYPE html> <html> <head> <meta charset="utf-8"> @@ -340,7 +340,7 @@ for (var i = 0; i < divs.length; i++) {Простая форма HTML, в которой требуется ввести ваше имя и фамилию:
-<form> +<form> <div> <label for="fname">Имя: </label> <input id="fname" type="text"> @@ -356,7 +356,7 @@ for (var i = 0; i < divs.length; i++) { <p></p>-div { +div { margin-bottom: 10px; }@@ -364,7 +364,7 @@ for (var i = 0; i < divs.length; i++) {В JavaScript мы реализуем очень простую проверку внутри обработчика события onsubmit (событие "отправить" запускается в форме, когда оно отправлено), который проверяет, пусты ли текстовые поля. Если они пусты, мы вызываем функцию
-preventDefault()
объекта события, которая останавливает отправку формы, а затем выводит сообщение об ошибке в абзаце ниже нашей формы, чтобы сообщить пользователю, что не так:var form = document.querySelector('form'); +var form = document.querySelector('form'); var fname = document.getElementById('fname'); var lname = document.getElementById('lname'); var submit = document.getElementById('submit'); @@ -392,7 +392,7 @@ form.onsubmit = function(e) {Hidden video example
-<!DOCTYPE html> +<!DOCTYPE html> <html> <head> <meta charset="utf-8"> @@ -469,7 +469,7 @@ form.onsubmit = function(e) {Это довольно простой пример, который показывает и скрывает {{htmlelement ("div")}} с элементом {{htmlelement ("video")}} внутри него:
-<button>Display video</button> +<button>Display video</button> <div class="hidden"> <video> @@ -481,7 +481,7 @@ form.onsubmit = function(e) {При нажатии на кнопку {{htmlelement ("button")}}, изменяется атрибут класса элемента
-<div>
сhidden
наshowing
(CSS примера содержит эти два класса, которые размещают блок вне экрана и на экране соответственно):div { +div { position: absolute; top: 50%; transform: translate(-50%,-50%); @@ -494,14 +494,14 @@ form.onsubmit = function(e) { left: 50%; }-var btn = document.querySelector('button'); +var btn = document.querySelector('button'); btn.onclick = function() { videoBox.setAttribute('class', 'showing'); }Затем мы добавляем ещё пару обработчиков событий
-onclick.
Первый к<div>
, а второй к<video>
. Идея заключается в том, чтобы при щелчке по области<div>
вне зоны видео поле снова скрылось, а при клике в области<video>
видео начало воспроизводиться.var videoBox = document.querySelector('div'); +var videoBox = document.querySelector('div'); var video = document.querySelector('video'); videoBox.onclick = function() { @@ -549,7 +549,7 @@ video.onclick = function() {Поэтому мы можем исправить нашу текущую проблему, изменив вторую функцию-обработчик в предыдущем блоке кода:
-video.onclick = function(e) { +video.onclick = function(e) { e.stopPropagation(); video.play(); };diff --git a/files/ru/learn/javascript/building_blocks/functions/index.html b/files/ru/learn/javascript/building_blocks/functions/index.html index 0db2a14713..9e8fa1c75d 100644 --- a/files/ru/learn/javascript/building_blocks/functions/index.html +++ b/files/ru/learn/javascript/building_blocks/functions/index.html @@ -39,7 +39,7 @@ translation_of: Learn/JavaScript/Building_blocks/FunctionsВ этом курсе мы использовали функции, встроенные в браузер. Каждый раз, когда мы манипулировали текстовой строкой, например:
-var myText = 'Я строка'; +var myText = 'Я строка'; var newString = myText.replace('строка', 'сосиска'); console.log(newString); // Функция строки replace() принимает строку, @@ -48,7 +48,7 @@ console.log(newString);Или каждый раз, когда мы манипулировали массивом:
-var myArray = ['Я', 'люблю', 'шоколадных', 'лягушек']; +var myArray = ['Я', 'люблю', 'шоколадных', 'лягушек']; var madeAString = myArray.join(' '); console.log(madeAString); // Функция join() принимает массив, соединяет @@ -57,7 +57,7 @@ console.log(madeAString);Или каждый раз, когда мы генерировали случайное число:
-var myNumber = Math.random() +var myNumber = Math.random() // Функция random() генерирует случайное число от 0 до 1, // и возвращает это число@@ -83,7 +83,7 @@ console.log(madeAString);В этом курсе так же использовались пользовательские функции — это функции, которые вы определяете в своём коде, а не внутри браузера. Каждый раз, когда вы видели произвольное слово (имя функции) с круглыми скобками прямо после него, вы использовали пользовательскую функцию. В нашем примере random-canvas-circles.html (подробнее см. исходный код) из нашей статьи о циклах мы включили пользовательскую функцию
-draw()
, которая выглядит так:function draw() { +function draw() { ctx.clearRect(0,0,WIDTH,HEIGHT); for (var i = 0; i < 100; i++) { ctx.beginPath(); @@ -95,11 +95,11 @@ console.log(madeAString);Эта функция рисует 100 случайных кругов внутри элемента {{htmlelement("canvas")}}. Каждый раз, когда мы хотим это сделать, мы можем вызвать эту функцию следующим образом
-draw();+draw();вместо того, чтобы каждый раз, когда мы хотим повторить этот код, не писать его заново. И функции могут содержать любой код, который вам нравится - вы можете даже вызывать другие функции внутри своих функций. Вышеупомянутая функция, например, вызывает функцию
-random()
три раза, которая выглядит следующим образом:function random(number) { +function random(number) { return Math.floor(Math.random()*number); }@@ -109,7 +109,7 @@ console.log(madeAString);Скорее всего, вы уже поняли это, но на всякий случай ... чтобы использовать функцию после того, как она была определена, вам нужно запустить или вызвать её. Это делается путём включения имени функции в код где-нибудь, за которым следуют скобки.
-function myFunction() { +function myFunction() { alert('привет'); } @@ -120,19 +120,19 @@ myFunction()Вы можете видеть функции, определённые и вызываемые несколькими разными способами. До этого мы создавали функции таким способом:
-function myFunction() { +function myFunction() { alert('привет'); }Но вы также можете создавать функции без имени:
-function() { +function() { alert('привет'); }Такая функция называется безымянная функция (или анонимная) — она не имеет имени! Она сама по себе ничего не делает. Обычно такие функции используются вместе с обработчиком событий, например, следующее будет вызывать код внутри функции каждый раз, по нажатию соответствующей кнопки:
-var myButton = document.querySelector('button'); +var myButton = document.querySelector('button'); myButton.onclick = function() { alert('привет'); @@ -142,34 +142,34 @@ myButton.onclick = function() {Вы также можете присвоить к переменной анонимную функцию, например:
-var myGreeting = function() { +var myGreeting = function() { alert('привет'); }Теперь эту функцию можно вызвать, используя:
-myGreeting();+myGreeting();Фактически такой способ присваивает переменной имя; вы также можете присвоить функцию значением нескольких переменных, например:
-var anotherGreeting = function() { +var anotherGreeting = function() { alert('привет'); }Теперь функцию можно вызвать, используя любую из переменных
-myGreeting(); +myGreeting(); anotherGreeting();Но это может ввести в заблуждение, так что не стоит так делать! При создании функций лучше всего придерживаться следующего вида:
-function myGreeting() { +function myGreeting() { alert('привет'); }Чаще всего вы будете использовать анонимные функции, чтобы просто запускать код при срабатывания события - например, нажатие кнопки - с помощью обработчика событий. Опять же, это выглядит примерно так:
-myButton.onclick = function() { +myButton.onclick = function() { alert('привет'); // При желании, внутри этой функции // можно написать много кода. @@ -185,11 +185,11 @@ anotherGreeting();Например встроенная в браузер функция Math.random() не требует параметров. При вызове, она всегда возвращает случайное число от 0 до 1:
-var myNumber = Math.random();+var myNumber = Math.random();Браузерная встроенная функция, работающая со строкой, replace() ожидает два параметра — это подстрока для поиска в основной строке и строка, на которую происходит замена в основной строке:
-var myText = 'Я строка'; +var myText = 'Я строка'; var newString = myText.replace('строка', 'сосиска');@@ -198,7 +198,7 @@ var newString = myText.replace('строка', 'сосиска');Следует также отметить, что иногда параметры являются необязательными - вам не нужно их указывать. Если вы этого не сделаете, функция, как правило, примет какое-то поведение по умолчанию. В качестве примера параметр функции массива join() необязателен:
-var myArray = ['Я', 'люблю', 'шоколадных', 'лягушек']; +var myArray = ['Я', 'люблю', 'шоколадных', 'лягушек']; var madeAString = myArray.join(' '); // Вернёт 'Я люблю шоколадных лягушек' var madeAString = myArray.join(); @@ -216,20 +216,20 @@ var madeAString = myArray.join();Например, скажем, у вас есть файл HTML, который вызывается в двух внешних файлах JavaScript, и оба они имеют переменную и определённую функцию, которые используют одно и то же имя:
-<!-- Excerpt from my HTML --> +<!-- Excerpt from my HTML --> <script src="first.js"></script> <script src="second.js"></script> <script> greeting(); </script>-// first.js +// first.js var name = 'Chris'; function greeting() { alert('Hello ' + name + ': welcome to our company.'); }-// second.js +// second.js var name = 'Zaptec'; function greeting() { alert('Our company is called ' + name + '.'); @@ -257,14 +257,14 @@ function greeting() {Сначала создайте локальную копию нашего примера function-scope.html. Это содержит две функции, называемые a()
иb()
, и три переменные -x
,y
иz
- две из которых определены внутри функций и одна в глобальной области. Он также содержит третью функцию, называемуюoutput()
, которая принимает один параметр и выводит его в абзаце на странице.Откройте пример в браузере и в текстовом редакторе. Откройте консоль JavaScript в инструментах разработчика вашего браузера. В консоли JavaScript введите следующую команду: - output(x);+output(x);вы должны увидеть значение переменнойx
вывод на экране.Теперь попробуйте ввести следующее в консоли - output(y); +output(y); output(z);Оба из них должны возвращать ошибку в строке "ReferenceError: y is not defined". Почему это? Из-за функции scope -y
иz
блокируются внутри функцийa()
иb()
, поэтомуoutput()
не может получить к ним доступ при вызове из глобальной области.Однако как насчёт того, когда он вызван изнутри другой функции? Попробуйте отредактировать функции a()
иb()
, чтобы они выглядели следующим образом: -function a() { +function a() { var y = 2; output(y); } @@ -275,11 +275,11 @@ function b() { }Сохраните код и перезагрузите его в своём браузере, затем попробуйте вызвать функцииa()
иb()
из консоли JavaScript: -a(); +a(); b();вы должны увидеть значения y и z, выводимые на странице. Это отлично работает, так как функцияoutput()
вызывается внутри других функций - в той же области, где переменные, которые она печатает, определяются в каждом случае.output()
доступен из любого места, поскольку он определён в глобальной области.Теперь попробуйте обновить свой код следующим образом: - function a() { +function a() { var y = 2; output(x); } @@ -290,13 +290,13 @@ function b() { }Сохраните и перезагрузите снова и повторите попытку в консоли JavaScript:- a(); +
a(); b();
Оба вызова
a()
иb()
должны выводить значение x - 1. Они работают нормально, потому что, хотя вызовыoutput()
не находятся в той же области, где определеноx
,x
- глобальная переменная, поэтому она доступна внутри всего кода, вездеНаконец, попробуйте обновить свой код следующим образом: - function a() { +
Сохраните и перезагрузите снова и повторите попытку в консоли JavaScript:function a() { var y = 2; output(z); } @@ -307,7 +307,7 @@ function b() { }
- @@ -329,7 +329,7 @@ b();a(); +
a(); b();
Имейте в виду, что вы можете вызывать функцию из любого места, даже если она внутри другой функции. Это часто используется как способ поддержания чистоты кода. Если у вас есть большая сложная функция, её легче понять, если разбить её на несколько подфункций:
-function myBigFunction() { +function myBigFunction() { var myValue; subFunction1(); @@ -352,7 +352,7 @@ function subFunction3() {Просто убедитесь, что значения, используемые внутри функции, находятся в области видимости. В приведённом выше примере выдаётся ошибка
-ReferenceError: MyValue is not defined
, поскольку хотя переменнаяmyValue
определена в той же области, что и вызовы функций, она не определена в определениях функций - фактический код, который запускается при вызове функций. Чтобы это работало, вам нужно передать значение в функцию в качестве параметра, например так:function myBigFunction() { +function myBigFunction() { var myValue = 1; subFunction1(myValue); diff --git a/files/ru/learn/javascript/building_blocks/looping_code/index.html b/files/ru/learn/javascript/building_blocks/looping_code/index.html index b3f85a278e..773fc55377 100644 --- a/files/ru/learn/javascript/building_blocks/looping_code/index.html +++ b/files/ru/learn/javascript/building_blocks/looping_code/index.html @@ -41,7 +41,7 @@ translation_of: Learn/JavaScript/Building_blocks/Looping_codeВ псевдокоде это будет выглядеть следующим образом:
-loop(food = 0; foodNeeded = 10) { +loop(food = 0; foodNeeded = 10) { if (food = foodNeeded) { exit loop; // У нас достаточно еды, пора домой @@ -64,7 +64,7 @@ translation_of: Learn/JavaScript/Building_blocks/Looping_codeHidden code
-<!DOCTYPE html> +<!DOCTYPE html> <html> <head> <meta charset="utf-8"> @@ -135,7 +135,7 @@ translation_of: Learn/JavaScript/Building_blocks/Looping_codeВам необязательно понимать все части кода, но давайте посмотрим на место, где рисуются 100 кругов.
-for (var i = 0; i < 100; i++) { +for (var i = 0; i < 100; i++) { ctx.beginPath(); ctx.fillStyle = 'rgba(255,0,0,0.5)'; ctx.arc(random(WIDTH), random(HEIGHT), random(50), 0, 2 * Math.PI); @@ -151,7 +151,7 @@ translation_of: Learn/JavaScript/Building_blocks/Looping_codeЕсли бы мы не использовали циклы, нам бы пришлось повторить следующий код, для отрисовки каждого круга:
-ctx.beginPath(); +ctx.beginPath(); ctx.fillStyle = 'rgba(255,0,0,0.5)'; ctx.arc(random(WIDTH), random(HEIGHT), random(50), 0, 2 * Math.PI); ctx.fill();@@ -162,7 +162,7 @@ ctx.fill();Рассмотрим некоторые конкретные конструкции циклов. Первый вариант, который вы будете использовать чаще всего, это цикл for. Он имеет следующий синтаксис:
-for (initializer; exit-condition; final-expression) { +for (initializer; exit-condition; final-expression) { // код для выполнения }@@ -182,7 +182,7 @@ ctx.fill();Посмотрим на пример, чтобы разобраться в этом более детально.
-var cats = ['Билл', 'Макс', 'Пикси', 'Алиса', 'Жасмин']; +var cats = ['Билл', 'Макс', 'Пикси', 'Алиса', 'Жасмин']; var info = 'Моих кошек зовут '; var para = document.querySelector('p'); @@ -197,7 +197,7 @@ para.textContent = info;Hidden code 2
-<!DOCTYPE html> +<!DOCTYPE html> <html> <head> <meta charset="utf-8"> @@ -266,7 +266,7 @@ para.textContent = info;В идеале мы хотим изменить конкатенацию на последней итерации цикла так, чтобы у нас не было запятой в конце предложения. Для этого нужно добавить условное выражение внутрь цикла
-for
для обработки этого особого случая:for (var i = 0; i < cats.length; i++) { +for (var i = 0; i < cats.length; i++) { if (i === cats.length - 1) { info += 'и ' + cats[i] + '.'; } else { @@ -291,7 +291,7 @@ para.textContent = info;Предположим, в массиве данных мы хотим найти имена контактов и телефонные номера, а вернуть только номер, который мы нашли.
-
Начнём с разметки HTML: поле {{htmlelement("input")}} позволяет нам ввести имя для поиска, элемент (кнопка) {{htmlelement("button")}} для подтверждения поиска, и элемент {{htmlelement("p")}} для отображения результата:<label for="search">Поиск по имени: </label> +<label for="search">Поиск по имени: </label> <input id="search" type="text"> <button>Поиск</button> @@ -299,7 +299,7 @@ para.textContent = info;Теперь в JavaScript:
-var contacts = ['Григорий:2232322', 'Марина:3453456', 'Василий:7654322', 'Наталья:9998769', 'Диана:9384975']; +var contacts = ['Григорий:2232322', 'Марина:3453456', 'Василий:7654322', 'Наталья:9998769', 'Диана:9384975']; var para = document.querySelector('p'); var input = document.querySelector('input'); var btn = document.querySelector('button'); @@ -322,7 +322,7 @@ btn.addEventListener('click', function() {Hidden code 3
-<!DOCTYPE html> +<!DOCTYPE html> <html> <head> <meta charset="utf-8"> @@ -395,7 +395,7 @@ btn.addEventListener('click', function() {Код HTML в основном такой же, как и в предыдущем примере — простой ввод текста и абзац для вывода. JavaScript в основном такой же, хотя сам цикл немного другой:
-var num = input.value; +var num = input.value; for (var i = 1; i <= num; i++) { var sqRoot = Math.sqrt(i); @@ -411,7 +411,7 @@ for (var i = 1; i <= num; i++) {Hidden code 4
-<!DOCTYPE html> +<!DOCTYPE html> <html> <head> <meta charset="utf-8"> @@ -473,7 +473,7 @@ for (var i = 1; i <= num; i++) {Рассмотрим цикл while. Синтаксис этого цикла выглядит так:
-initializer +initializer while (exit-condition) { // code to run @@ -488,7 +488,7 @@ while (exit-condition) {Посмотрим ещё раз пример со списком кошек с кодом переписанным под использование цикла
-while:
var i = 0; +var i = 0; while (i < cats.length) { if (i === cats.length - 1) { @@ -506,7 +506,7 @@ while (i < cats.length) {Цикл do...while представляет собой вариацию структуры цикла
-while
:initializer +initializer do { // code to run @@ -519,7 +519,7 @@ do {Перепишем наш пример с кошками, чтобы использовать цикл
-do...while
:var i = 0; +var i = 0; do { if (i === cats.length - 1) { @@ -568,7 +568,7 @@ do {Active learning
-<h2>Live output</h2> +<h2>Live output</h2> <div class="output" style="height: 410px;overflow: auto;"> </div> @@ -598,7 +598,7 @@ output.innerHTML = ''; -html { +html { font-family: sans-serif; } @@ -626,7 +626,7 @@ body { -var textarea = document.getElementById('code'); +var textarea = document.getElementById('code'); var reset = document.getElementById('reset'); var solution = document.getElementById('solution'); var code = textarea.value; @@ -740,7 +740,7 @@ textarea.onkeyup = function(){Active learning 2
-<h2>Live output</h2> +<h2>Live output</h2> <div class="output" style="height: 100px;overflow: auto;"> <p class="admitted">Пригласить: </p> <p class="refused">Не приглашать(!): </p> @@ -769,7 +769,7 @@ refused.textContent = 'Не приглашать(!): ' </div>-html { +html { font-family: sans-serif; } @@ -789,7 +789,7 @@ body { background: #f5f9fa; }-var textarea = document.getElementById('code'); +var textarea = document.getElementById('code'); var reset = document.getElementById('reset'); var solution = document.getElementById('solution'); var code = textarea.value; @@ -875,13 +875,13 @@ textarea.onkeyup = function(){-
For
:for (initializer; exit-condition; final-expression) { +for (initializer; exit-condition; final-expression) { // code to run }-
while
:initializer +initializer while (exit-condition) { // code to run @@ -890,7 +890,7 @@ while (exit-condition) {-
do...while
:initializer +initializer do { // code to run diff --git a/files/ru/learn/javascript/client-side_web_apis/client-side_storage/index.html b/files/ru/learn/javascript/client-side_web_apis/client-side_storage/index.html index 940cbe5333..fb71ec78d6 100644 --- a/files/ru/learn/javascript/client-side_web_apis/client-side_storage/index.html +++ b/files/ru/learn/javascript/client-side_web_apis/client-side_storage/index.html @@ -98,12 +98,12 @@ translation_of: Learn/JavaScript/Client-side_web_APIs/Client-side_storage{{domxref("Storage.setItem()")}} метод позволяет сохранить элемент данных в хранилище - он принимает два параметра: имя элемента и его значение. Попробуйте ввести это в свою консоль JavaScript (измените значение на своё собственное имя, если хотите!):
-localStorage.setItem('name','Chris');+localStorage.setItem('name','Chris');{{domxref("Storage.getItem()")}} метод принимает один параметр - имя элемента данных, который вы хотите получить - и возвращает значение элемента. Теперь введите эти строки в вашу консоль JavaScript:
-var myName = localStorage.getItem('name'); +var myName = localStorage.getItem('name'); myNameПосле ввода во второй строке вы должны увидеть, что переменная
@@ -111,7 +111,7 @@ myNamemyName
теперь содержит значение элемента данныхname
.{{domxref("Storage.removeItem()")}} метод принимает один параметр - имя элемента данных, который вы хотите удалить, - и удаляет этот элемент из веб-хранилища. Введите следующие строки в вашу консоль JavaScript:
-localStorage.removeItem('name'); +localStorage.removeItem('name'); var myName = localStorage.getItem('name'); myName@@ -130,7 +130,7 @@ myNameВведите эти строки в консоль JavaScript браузера:
-localStorage.setItem('name','Chris'); +localStorage.setItem('name','Chris'); var myName = localStorage.getItem('name'); myName@@ -142,7 +142,7 @@ myNameВведите следующий код:
-var myName = localStorage.getItem('name'); +var myName = localStorage.getItem('name'); myNameВы должны увидеть, что значение всё ещё доступно, даже после закрытия / открытия браузера.
@@ -175,7 +175,7 @@ myNameМы начнём с создания ссылок на все функции HTML, которыми мы должны манипулировать в этом примере - мы создадим их все как константы, поскольку эти ссылки не нужно изменять в жизненном цикле приложения. Добавьте следующие строки в ваш файл JavaScript:
-// create needed constants +// create needed constants const rememberDiv = document.querySelector('.remember'); const forgetDiv = document.querySelector('.forget'); const form = document.querySelector('form'); @@ -189,7 +189,7 @@ const personalGreeting = document.querySelector('.personal-greeting');Далее нам нужно включить небольшой обработчик событий, чтобы форма фактически не отправляла себя при нажатии кнопки отправки, так как это не то поведение, которое нам нужно. Добавьте этот фрагмент ниже вашего предыдущего кода:
-// Stop the form from submitting when a button is pressed +// Stop the form from submitting when a button is pressed form.addEventListener('submit', function(e) { e.preventDefault(); });@@ -197,7 +197,7 @@ form.addEventListener('submit', function(e) {Теперь нам нужно добавить обработчик событий, функция-обработчик которого будет запускаться при нажатии кнопки «Say hello». В комментариях подробно объясняется, что делает каждый бит, но в сущности здесь мы берём имя, которое пользователь ввёл в поле ввода текста, и сохраняем его в веб-хранилище с помощью
-setItem()
, затем запускаем функциюnameDisplayCheck()
, которая будет обрабатывать обновление фактического текста сайта. Добавьте это в конец:// run function when the 'Say hello' button is clicked +// run function when the 'Say hello' button is clicked submitBtn.addEventListener('click', function() { // store the entered name in web storage localStorage.setItem('name', nameInput.value); @@ -209,7 +209,7 @@ submitBtn.addEventListener('click', function() {На этом этапе нам также необходим обработчик событий для запуска функции при нажатии кнопки «Forget» — она будет отображена только после того как кнопка «Say hello» будет нажата (две формы состояния для переключения между ними). В этой функции мы удаляем переменную
-name
из веб-хранилища используяremoveItem()
, затем снова запускаемnameDisplayCheck()
для обновления. Добавьте этот код в конец:// run function when the 'Forget' button is clicked +// run function when the 'Forget' button is clicked forgetBtn.addEventListener('click', function() { // Remove the stored name from web storage localStorage.removeItem('name'); @@ -221,7 +221,7 @@ forgetBtn.addEventListener('click', function() {Самое время для определения самой функции
-nameDisplayCheck()
. Здесь мы проверяем была ли переменнаяname
сохранена в веб-хранилище с помощьюlocalStorage.getItem('name')
в качестве условия. Если переменнаяname
была сохранена, то вызов вернёт -true
; если же нет, то -false
. Еслиtrue
, мы показываем персональное приветствие, отображаем кнопку «Forget», и скрываем кнопку «Say hello». Если жеfalse
, мы отображаем общее приветствие и делаем обратное. Опять же, добавьте следующий код в конец:// define the nameDisplayCheck() function +// define the nameDisplayCheck() function function nameDisplayCheck() { // check whether the 'name' data item is stored in web Storage if(localStorage.getItem('name')) { @@ -245,7 +245,7 @@ function nameDisplayCheck() {@@ -291,7 +291,7 @@ function nameDisplayCheck() { Последнее но не менее важное, нам необходимо запускать функцию
-nameDisplayCheck()
при каждой загрузке страницы. Если мы не сделаем этого, персональное приветствие не будет сохранятся после перезагрузки страницы. Добавьте следующий фрагмент в конец вашего кода:document.body.onload = nameDisplayCheck;+document.body.onload = nameDisplayCheck;Below the constant declarations, add the following lines:
-// Create an instance of a db object for us to store the open database in +// Create an instance of a db object for us to store the open database in let db;Here we are declaring a variable called
@@ -299,7 +299,7 @@ let db;db
— this will later be used to store an object representing our database. We will use this in a few places, so we've declared it globally here to make things easier.Next, add the following to the bottom of your code:
-window.onload = function() { +window.onload = function() { };@@ -308,7 +308,7 @@ let db;Inside the
-window.onload
handler, add the following:// Open our database; it is created if it doesn't already exist +// Open our database; it is created if it doesn't already exist // (see onupgradeneeded below) let request = window.indexedDB.open('notes', 1);@@ -323,7 +323,7 @@ let request = window.indexedDB.open('notes', 1);Now add the following event handlers just below your previous addition — again inside the
-window.onload
handler:// onerror handler signifies that the database didn't open successfully +// onerror handler signifies that the database didn't open successfully request.onerror = function() { console.log('Database failed to open'); }; @@ -346,7 +346,7 @@ request.onsuccess = function() {Finally for this section, we'll add probably the most important event handler for setting up the database: {{domxref("IDBOpenDBRequest.onupgradeneeded", "request.onupdateneeded")}}. This handler runs if the database has not already been set up, or if the database is opened with a bigger version number than the existing stored database (when performing an upgrade). Add the following code, below your previous handler:
-// Setup the database tables if this has not already been done +// Setup the database tables if this has not already been done request.onupgradeneeded = function(e) { // Grab a reference to the opened database let db = e.target.result; @@ -372,7 +372,7 @@ request.onupgradeneeded = function(e) {So with this simple database schema set up, when we start adding records to the database each one will be represented as an object along these lines:
-
@@ -194,7 +194,7 @@ para.style.textAlign = 'center';
- В качестве примера попробуйте добавить эти строки в наш текущий пример: -
para.style.color = 'white'; +para.style.color = 'white'; para.style.backgroundColor = 'black'; para.style.padding = '10px'; para.style.width = '250px'; para.style.textAlign = 'center';- Перезагрузите страницу, и вы увидите, что стили были применены к абзацу. Если вы посмотрите на этот параграф в инспекторе Page Inspector/DOM inspector вашего браузера, вы увидите, что эти строки действительно добавляют встроенные стили в документ: -
<p style="color: white; background-color: black; padding: 10px; width: 250px; text-align: center;">We hope you enjoyed the ride.</p>+<p style="color: white; background-color: black; padding: 10px; width: 250px; text-align: center;">We hope you enjoyed the ride.</p>@@ -230,17 +230,17 @@ para.style.textAlign = 'center';
- Удалите предыдущие пять строк, добавленных в JavaScript.
- Добавьте в свой HTML-код следующее: {{htmlelement("head")}}: -
<style> +<style> .highlight { color: white; background-color: black; @@ -205,7 +205,7 @@ para.style.textAlign = 'center';</style>- Теперь мы перейдём к очень полезному методу для общего манипулирования HTML - {{domxref("Element.setAttribute()")}} - это принимает два аргумента, атрибут, который вы хотите установить для элемента, и значение, которое вы хотите для его установки. В этом случае мы укажем имя класса выделения в нашем абзаце: -
para.setAttribute('class', 'highlight');+para.setAttribute('class', 'highlight');- Обновите свою страницу, и вы не увидите изменений - CSS по-прежнему применяется к абзацу, но на этот раз, предоставив ему класс, который выбран нашим правилом CSS, а не как встроенные стили CSS.
- Прежде всего, давайте возьмём ссылку на div, а затем возьмём ширину и высоту окна просмотра (внутреннее окно, где отображается ваш документ) и сохраните их в переменных - эти два значения удобно содержатся в {{domxref("Window.innerWidth")}} и {{domxref("Window.innerHeight")}}. Добавьте следующие строки внутри существующего элемента {{htmlelement("script")}}: -
var div = document.querySelector('div'); +var div = document.querySelector('div'); var WIDTH = window.innerWidth; var HEIGHT = window.innerHeight;- Затем мы динамически изменяем ширину и высоту div, равную ширине окна просмотра. Добавьте следующие две строки ниже своих первых: -
div.style.width = WIDTH + 'px'; +div.style.width = WIDTH + 'px'; div.style.height = HEIGHT + 'px';- Сохраните и попробуйте обновить браузер - теперь вы должны увидеть, что div становится таким же большим, как ваш видовой экран, независимо от того, какой размер экрана вы используете. Если теперь вы попытаетесь изменить размер окна, чтобы увеличить его, вы увидите, что div остаётся одного размера - мы устанавливаем его только один раз.
- Как насчёт того, чтобы мы использовали событие, чтобы размер div изменялся при изменении размера окна? Объект {{domxref("Window")}} имеет событие, имеющееся на нем с именем resize, которое запускается каждый раз при изменении размера окна - давайте обратимся к нему через обработчик событий {{domxref("Window.onresize")}} и повторяйте наш размерный код каждый раз, когда он изменяется. Добавьте нижеследующую часть кода: -
window.onresize = function() { +window.onresize = function() { WIDTH = window.innerWidth; HEIGHT = window.innerHeight; div.style.width = WIDTH + 'px'; diff --git a/files/ru/learn/javascript/first_steps/a_first_splash/index.html b/files/ru/learn/javascript/first_steps/a_first_splash/index.html index 6da71e0814..e6a210e0d5 100644 --- a/files/ru/learn/javascript/first_steps/a_first_splash/index.html +++ b/files/ru/learn/javascript/first_steps/a_first_splash/index.html @@ -49,7 +49,7 @@ original_slug: Learn/JavaScript/Первые_шаги/A_first_splash-Top hidden code
-<!DOCTYPE html> +<!DOCTYPE html> <html> <head> @@ -207,7 +207,7 @@ original_slug: Learn/JavaScript/Первые_шаги/A_first_splashМесто, где мы будем добавлять весь наш код, находится внутри элемента {{htmlelement("script")}} в нижней части HTML:
-<script> +<script> // Your JavaScript goes here @@ -218,7 +218,7 @@ original_slug: Learn/JavaScript/Первые_шаги/A_first_splashДавайте начнём. Прежде всего добавьте следующие строки внутри элемента {{htmlelement("script")}} :
-var randomNumber = Math.floor(Math.random() * 100) + 1; +
var randomNumber = Math.floor(Math.random() * 100) + 1; var guesses = document.querySelector('.guesses'); var lastResult = document.querySelector('.lastResult'); @@ -237,12 +237,12 @@ var resetButton;
- Первой переменной - randomNumber - присваивается случайное число от 1 до 100, вычисленное с использованием математического алгоритма.
- Следующие три переменные сделаны для хранения ссылок на абзацы результатов в нашем HTML и используются для вставки значений в абзацы, приведённые далее в коде: -
<p class="guesses"></p> +<p class="guesses"></p> <p class="lastResult"></p> <p class="lowOrHi"></p>- Следующие две переменных хранят ссылки на форму ввода текста и кнопку отправки а позже используются для управления подачи догадки . -
<label for="guessField">Enter a guess: </label><input type="text" id="guessField" class="guessField"> +<label for="guessField">Enter a guess: </label><input type="text" id="guessField" class="guessField"> <input type="submit" value="Submit guess" class="guessSubmit">- Наши последние две переменные сохраняют количество догадок 1 (используется для отслеживания того, сколько догадок у игрока было), и ссылку на кнопку сброса, которая ещё не существует (но позже).
@@ -256,7 +256,7 @@ var resetButton;Затем добавьте следующие ниже предыдущего JavaScript:
-function checkGuess() { +function checkGuess() { alert('I am a placeholder'); }@@ -268,7 +268,7 @@ var resetButton;Перейдите к консоли JavaScript в инструментах разработчика, и введите следующую строку:
-checkGuess();+checkGuess();Вы должны увидеть предупреждение, в котором говорится "I am a placeholder"; в нашем коде мы определили функцию, которая создаёт предупреждение, когда её вызывают.
@@ -285,7 +285,7 @@ var resetButton;Hidden code
-<!DOCTYPE html> +<!DOCTYPE html> <html> <head> <meta charset="utf-8"> @@ -428,7 +428,7 @@ var resetButton;Вы также можете использовать оператор
-+
для сложения строк текста (в программировании это называется конкатенацией). Попробуйте ввести следующие строки:var name = 'Bingo'; +var name = 'Bingo'; name; var hello = ' says hello!'; hello; @@ -437,11 +437,11 @@ greeting;Также есть сокращённые операторы, называемые расширенными операторами присваивания. Например, если вы просто хотите добавить новую строку к существующей и вернуть результат, вы можете сделать так:
-name += ' says hello!';+name += ' says hello!';Это эквивалентно этому:
-name = name + ' says hello!';+name = name + ' says hello!';Когда мы запускаем проверку true/false (истина/ложь) (например, внутри условных выражений — смотри {{anch("Conditionals", "ниже")}}), мы используем операторы сравнения, например:
@@ -481,7 +481,7 @@ greeting;Теперь, заменим вашу текущую функцию
-checkGuess()
на эту версию:function checkGuess() { +function checkGuess() { var userGuess = Number(guessField.value); if (guessCount === 1) { guesses.textContent = 'Previous guesses: '; @@ -516,7 +516,7 @@ greeting;
- Первая строка (строка под номером 2 в коде выше) объявляет переменную с именем
userGuess
и устанавливает её значение на то, что сейчас введено в текстовое поле. Мы также пропускаем это значение через встроенный методNumber()
, чтобы убедится, что значение точно является числом.- Затем мы сталкиваемся с нашим первым блоком условного кода (строки 3–5 в коде выше). Блок условного кода позволяет выборочно запускать код в зависимости от того, является определённое условие истинным или нет. Он немного похож на функцию, но это не так. Простейшая форма условного блока начинается с ключевого слова
if
, за ним круглые скобки, за ними ещё фигурные скобки. В круглые скобки мы добавляем проверку. Если проверка возвращаетtrue
, запускается код в фигурных скобках. Если нет, этот код пропускается и мы переходим к следующей части кода. В этом случае проверяется равна ли переменнаяguessCount
числу1
(то есть является ли это первой попыткой игрока или нет): -guessCount === 1+guessCount === 1Если это так, мы выводим параграф с содержанием "Previous guesses: ". Если нет, ничего не делаем.- Строка 6 добавляет текущее значение
userGuess
в конец параграфаguesses
, плюс пустое пространство поэтому между каждыми показанными предположениями будет пробел.- Следующий блок (строки 8–24 ) делает несколько проверок: @@ -535,7 +535,7 @@ greeting;
Добавьте следующую строку ниже закрывающей фигурной скобки функции
-checkGuess()
:guessSubmit.addEventListener('click', checkGuess);+guessSubmit.addEventListener('click', checkGuess);Здесь мы добавляем обработчик событий к кнопке
@@ -545,7 +545,7 @@ greeting;guessSubmit
. Это метод, который принимает два входных значения (называемые аргументами) - тип события, которое мы обработаем (в данном случаеclick
) в виде строки, и код, который мы хотим запустить при возникновении события (в данном случае функцияcheckGuess()
- обратите внимание, что нам не нужно указывать круглые скобки при записи внутри {{domxref("EventTarget.addEventListener", "addEventListener()")}}).Давайте добавим функцию
-setGameOver()
в конец нашего кода, а затем пройдём по ней. Добавьте это под нижней частью вашего JavaScript:function setGameOver() { +function setGameOver() { guessField.disabled = true; guessSubmit.disabled = true; resetButton = document.createElement('button'); @@ -562,7 +562,7 @@ greeting;Теперь нам нужно также определить эту функцию! Добавьте следующий код, снова в нижнюю часть вашего JavaScript:
-function resetGame() { +function resetGame() { guessCount = 1; var resetParas = document.querySelectorAll('.resultParas p'); @@ -607,14 +607,14 @@ greeting;for (var i = 1 ; i < 21 ; i++) { console.log(i) }+for (var i = 1 ; i < 21 ; i++) { console.log(i) }Что случилось? Номера с 1 по 20 были напечатаны в консоли. Это из-за цикла. Цикл for принимает три входных значения (аргументы):
Начальное значение: в этом случае мы начинаем подсчёт c 1, но это может быть любое число которое вам нравится. Вы можете заменить i любым другим именем, которое вам нравится, но я использую его как условность, потому что оно короткое и легко запоминается. Условие выхода: Здесь мы указали i <21 - цикл будет продолжаться до тех пор, пока i будет меньше 21. Когда i достигнет 21, цикл больше не будет работать. Инкремент: мы указали i ++, что означает «увеличить i на 1». Цикл будет выполняться один раз для каждого значения i, пока оно не достигнет значения 21 (как обсуждалось выше). В этом случае мы просто печатаем значение i в консоли на каждой итерации с помощью {{domxref ("Console.log", "console.log ()")}}.Теперь давайте посмотрим на цикл в нашей игре угадывания чисел - в функции resetGame () можно найти следующее:
-var resetParas = document.querySelectorAll('.resultParas p'); +var resetParas = document.querySelectorAll('.resultParas p'); for (var i = 0 ; i < resetParas.length ; i++) { resetParas[i].textContent = ''; }@@ -625,7 +625,7 @@ for (var i = 0 ; i < resetParas.length ; i++) {Давайте добавим ещё одно окончательное улучшение, прежде чем перейти к обсуждению. Добавьте следующую строку чуть ниже
-var resetButton;
в верхней части вашего JavaScript, затем сохраните файл:guessField.focus();+guessField.focus();Эта строка использует метод {{domxref("HTMLElement.focus", "focus()")}}, чтобы автоматически помещать текстовый курсор в текстовое поле {{htmlelement("input")}}, как только загрузится страница. Пользователь сможет сразу набрать свою первую догадку, не нажимая поле формы. Это всего лишь небольшое дополнение, но оно улучшает удобство использования - даёт пользователю хорошую визуальную подсказку относительно того, что они должны делать в игре.
@@ -633,13 +633,13 @@ for (var i = 0 ; i < resetParas.length ; i++) {В нашем примере мы сначала создали переменную
-guessField
, которая запоминает значение из поля ввода в нашем HTML - следующая строка находится среди первых в нашем коде:var guessField = document.querySelector('.guessField');+var guessField = document.querySelector('.guessField');Чтобы получить это значение, мы использовали метод {{domxref("document.querySelector", "querySelector()")}} объекта {{domxref("document")}}.
querySelector()
"берет" одну часть информации - CSS selector, который выбирает нужный элемент.Поскольку
-guessField
теперь содержит ссылку на элемент {{htmlelement("input")}}, теперь он будет иметь доступ к ряду свойств (в основном к переменным, хранящимся внутри объектов, некоторые значения которых нельзя изменять) и методы (в основном функции, хранящиеся внутри объектов). Одним из методов, доступных для ввода элементов, является focus (), поэтому мы можем теперь использовать эту строку для фокусировки ввода текста:guessField.focus();+guessField.focus();Для переменных, которые не содержат ссылок на элементы формы, не будет доступен
@@ -652,17 +652,17 @@ for (var i = 0 ; i < resetParas.length ; i++) {focus()
. Например, переменнаяguesses
содержит ссылку на элемент {{htmlelement ("p")}}, аguessCount
содержит число.- Далее, откройте инструменты разработчика в вашем браузере, и убедитесь, что вы перешли во вкладку с консолью JavaScript.
- Введите
guessField
и консоль покажет, что переменная содержит элемент {{htmlelement("input")}}. Вы также можете заметить, что консоль автоматически заполняет имена объектов, которые существуют внутри исполняющей среды, включая ваши переменные!- Теперь введите следующее: -
guessField.value = 'Hello';+guessField.value = 'Hello';Свойствоvalue
представляет текущее значение, введённое в текстовое поле. Заметьте, что, введя эту команду, мы изменили его!- Попробуйте ввести
guesses
и нажать return. Консоль покажет, что в переменной содержится элемент {{htmlelement("p")}}.- Теперь попробуйте ввести: -
guesses.value+guesses.valueБраузер вернёт вамundefined
, потому чтоvalue
не существует в параграфах.- Для изменения текста внутри параграфа, взамен используйте свойство {{domxref("Node.textContent", "textContent")}}. Попробуйте: -
guesses.textContent = 'Where is my paragraph?';+guesses.textContent = 'Where is my paragraph?';- Теперь немного повеселимся. Попробуйте ввести следующие строки, одну за другой: -
guesses.style.backgroundColor = 'yellow'; +guesses.style.backgroundColor = 'yellow'; guesses.style.fontSize = '200%'; guesses.style.padding = '10px'; guesses.style.boxShadow = '3px 3px 6px black';diff --git a/files/ru/learn/javascript/first_steps/silly_story_generator/index.html b/files/ru/learn/javascript/first_steps/silly_story_generator/index.html index 042b6e844d..2cfbea95b2 100644 --- a/files/ru/learn/javascript/first_steps/silly_story_generator/index.html +++ b/files/ru/learn/javascript/first_steps/silly_story_generator/index.html @@ -125,7 +125,7 @@ original_slug: Learn/JavaScript/Первые_шаги/Создатель_глуdiff --git a/files/ru/learn/javascript/first_steps/strings/index.html b/files/ru/learn/javascript/first_steps/strings/index.html index 9acead263a..b63ccbcc82 100644 --- a/files/ru/learn/javascript/first_steps/strings/index.html +++ b/files/ru/learn/javascript/first_steps/strings/index.html @@ -37,17 +37,17 @@ original_slug: Learn/JavaScript/Первые_шаги/Строки
- Вам не нужно каким-либо образом редактировать HTML, кроме как применять JavaScript к вашему HTML.
- Если вы не уверены, правильно ли применяется JavaScript для вашего HTML-кода, попробуйте временно удалить все остальное из файла JavaScript, добавив в него простой кусочек JavaScript, который, как вы знаете, создаст очевидный эффект, а затем сохраните и обновите. Следующий, например, делает фон элемента {{htmlelement ("html")}} красного цвета - поэтому все окно браузера должно быть красным, если JavaScript применяется правильно: -
document.querySelector('html').style.backgroundColor = 'red';+document.querySelector('html').style.backgroundColor = 'red';- Math.round() - это встроенный метод JavaScript, который просто округляет результат вычисления до ближайшего целого числа.
@@ -56,22 +56,22 @@ badString;
- Для начала введите следующие строки: -
var string = 'The revolution will not be televised.'; +var string = 'The revolution will not be televised.'; string;- Как и в случае с числами, мы объявляем переменную, инициализируя её строковым значением, а затем возвращаем значение. Единственное различие здесь в том, что при написании строки вам нужно окружить значение кавычками.
- Если вы не сделаете этого или пропустите одну из кавычек, вы получите сообщение об ошибке. Попробуйте ввести следующие строки: -
var badString = This is a test; +var badString = This is a test; var badString = 'This is a test; var badString = This is a test';Эти строки не работают, потому что любая текстовая строка без кавычек считается именем переменной, именем свойства, зарезервированным словом или чем-то подобным. Если браузер не может найти его, возникает ошибка (например, «missing, before statement»). Если браузер может видеть, где начинается строка, но не может найти конец строки, как указано во 2-й строке, она жалуется на ошибку (с «unterminated string literal»). Если ваша программа выявляет такие ошибки, вернитесь назад и проверьте все свои строки, чтобы убедиться, что у вас нет пропущенных кавычек.- Следующий код будет выполнен только в том случае, если ранее была объявлена переменная
string
— убедитесь сами: -var badString = string; +var badString = string; badString;В настоящее время строкаbadString
имеет то же значение, что и строкаstring
.@@ -79,7 +79,7 @@ dblSgl;
- В JavaScript вы можете выбрать одинарные кавычки или двойные кавычки, чтобы обернуть ваши строки. Оба варианта будут работать нормально: -
var sgl = 'Single quotes.'; +var sgl = 'Single quotes.'; var dbl = "Double quotes"; sgl; dbl;- Существует очень мало различий между одиночными и двойными кавычками, и решение какие из них использовать в коде остаётся на ваше усмотрение. Однако вы должны выбрать один вариант и придерживаться его, иначе ваш код может выдать ошибку, особенно если вы используете разные кавычки в одной строке! Ниже приведён пример: -
var badQuotes = 'What on earth?";+var badQuotes = 'What on earth?";- Браузер будет считать, что строка не была закрыта, потому что в строке может появиться другой тип цитаты, который вы не используете, чтобы хранить ваши строки в переменных. Из примера можно понять, о чем идёт речь (в коде ошибок нет): -
var sglDbl = 'Would you eat a "fish supper"?'; +var sglDbl = 'Would you eat a "fish supper"?'; var dblSgl = "I'm feeling blue."; sglDbl; dblSgl;- Однако вы не можете включить один и тот же знак кавычки внутри строки, если он используется для их хранения. Ниже приведена ошибка, браузер ошибочно определяет место, где строка кончается: -
var bigmouth = 'I've got no right to take my place...';+var bigmouth = 'I've got no right to take my place...';Что приводит нас к следующей теме.Чтобы исправить нашу предыдущую строку кода, нам нужно дать понять браузеру, что кавычка в середине строки не является меткой её конца. Экранирование символов означает, что мы делаем что-то с ними, чтобы убедиться, что они распознаются как текст, а не часть кода. В JavaScript мы делаем это, помещая обратную косую черту непосредственно перед символом. Введите эти строки:
-var bigmouth = 'I\'ve got no right to take my place...'; +var bigmouth = 'I\'ve got no right to take my place...'; bigmouth;Так лучше. Таким же образом можно экранировать и другие символы, например
@@ -89,17 +89,17 @@ bigmouth;"\
. Кроме того существуют специальные коды. Для дополнительной информации см. Escape notation.@@ -112,9 +112,9 @@ response;
- Конкатенация — это новомодное программистское слово, которое означает «объединить». Объединение строк в JavaScript использует оператор плюс (+), тот же, который мы используем для сложения чисел, но в этом контексте он делает кое-что другое. Попробуем пример в нашей консоли.
- -
var one = 'Hello, '; +var one = 'Hello, '; var two = 'how are you?'; var joined = one + two; joined;Результат этой программы - это переменнаяjoined
, содержащая значение "Hello, how are you?".- В последнем случае мы просто объединим две строки вместе, но на самом деле, вы можете объединить столько строк, сколько хотите, до тех пор, пока вы ставите
+
между ними. Попробуйте это: -var multiple = one + one + one + one + two; +var multiple = one + one + one + one + two; multiple;- Вы также можете использовать сочетание переменных и фактических строк. Попробуйте это: -
var response = one + 'I am fine — ' + two; +var response = one + 'I am fine — ' + two; response;Давайте посмотрим на конкатенацию строк в действии — вот пример из предыдущего курса:
-<button>Press me</button>+<button>Press me</button>-var button = document.querySelector('button'); +var button = document.querySelector('button'); button.onclick = function() { var name = prompt('What is your name?'); @@ -129,22 +129,22 @@ button.onclick = function() {
- Итак, что происходит, когда мы пытаемся добавить (или конкатенировать) строку и число? Попробуем это в нашей консоли: -
'Front ' + 242; +'Front ' + 242;Вы можете ожидать, что это вызовет ошибку, но все работает отлично. Попытка представить строку как число на самом деле не имеет смысла, но число как строку — имеет, поэтому браузер довольно умно преобразует число в строку и объединяет две строки вместе.- Вы даже можете сделать это с двумя числами, вы можете заставить число стать строкой, обернув её в кавычки. Попробуйте следующее (мы используем оператор
typeof
для того, чтобы установить является ли переменная числом или строкой): -var myDate = '19' + '67'; +var myDate = '19' + '67'; typeof myDate;- Если у вас есть числовая переменная, которую вы хотите преобразовать в строчную без внесения каких-либо иных изменений или строковую переменную, которую вы хотите преобразовать в число, вы можете использовать следующие две конструкции:
- Объект {{jsxref ("Number")}} преобразует всё переданное в него в число, если это возможно. Попробуйте следующее: -
var myString = '123'; +var myString = '123'; var myNum = Number(myString); typeof myNum;- С другой стороны, каждое число имеет метод, называемый
diff --git a/files/ru/learn/javascript/first_steps/useful_string_methods/index.html b/files/ru/learn/javascript/first_steps/useful_string_methods/index.html index 722895282b..90450169e7 100644 --- a/files/ru/learn/javascript/first_steps/useful_string_methods/index.html +++ b/files/ru/learn/javascript/first_steps/useful_string_methods/index.html @@ -39,7 +39,7 @@ original_slug: Learn/JavaScript/Первые_шаги/Useful_string_methodstoString()
, который преобразует его в эквивалентную строку. Попробуй это: -var myNum = 123; +var myNum = 123; var myString = myNum.toString(); typeof myString;Почти всё в JavaScript является объектами. Когда вы создаёте строку, например:
-let string = 'This is my string';+let string = 'This is my string';ваша переменная становится строковым объектом, и, как результат, ей доступно множество свойств и методов. Можете убедиться в этом, перейдя на страницу {{jsxref ("String")}} и просмотрев на ней список свойств и методов!
@@ -51,7 +51,7 @@ original_slug: Learn/JavaScript/Первые_шаги/Useful_string_methodsЭто легко — вы просто используете свойство {{jsxref ("String.prototype.length", "length")}}. Попробуйте ввести следующие строки:
-let browserType = 'mozilla'; +let browserType = 'mozilla'; browserType.length;Результатом должно быть число 7, потому что слово «mozilla» состоит из 7 символов. Это свойство можно применить, например, если вы захотите найти длины серии имён, чтобы их можно было отображать по порядку длины или сообщить пользователю, что имя пользователя, которое он ввёл в поле формы, слишком длинное, если оно превышает определённую длину.
@@ -60,11 +60,11 @@ browserType.length;Вы можете вернуть любой символ внутри строки, используя обозначение в квадратных скобках. Это означает, что вы добавляете квадратные скобки ([ ]) в конце вашего имени переменной. В квадратных скобках вы указываете номер символа, который хотите вернуть. Например, чтобы получить первую букву, нужно написать:
-browserType[0];+browserType[0];Компьютеры считают от 0, а не 1! Чтобы получить последний символ любой строки, мы могли бы использовать следующую строку, объединив эту технику с свойством
-length
:browserType[browserType.length-1];+browserType[browserType.length-1];Длина слова «mozilla» равна 7, но, поскольку счёт начинается с 0, позиция последнего символа равна 6, поэтому нам нужна
@@ -72,17 +72,17 @@ browserType.length;length-1
. Такой способ можно использовать, чтобы найти первую букву ряда строк и упорядочить их по алфавиту.
- Иногда вам может понадобиться выяснить, присутствует ли меньшая строка внутри большей (обычно мы говорим, что внутри строки есть подстрока). Это можно сделать с помощью метода {{jsxref ("String.prototype.indexOf ()", "indexOf ()")}}, который принимает одну {{glossary ("parameter")}} - подстроку, которую вы хотите найти. Введите: -
browserType.indexOf('zilla');+browserType.indexOf('zilla');Это даёт нам результат 2, потому что подстрока «zilla» начинается в позиции 2 ("m" — 0, "o" — 1, "z" — 2) внутри «mozilla». Такой код можно использовать для фильтрации строк. Например, если есть список веб-адресов и вы хотите распечатать только те, которые содержат «mozilla».@@ -110,7 +110,7 @@ if(browserType.indexOf('mozilla') !== -1) {
- Это можно сделать по-другому, что, возможно, ещё более эффективно. Введите следующее: -
browserType.indexOf('vanilla');+browserType.indexOf('vanilla');Это должно дать вам результат -1. Такое значение возвращается, когда подстрока, в данном случае «vanilla», не найдена в основной строке.
Вы можете использовать это, чтобы найти все экземпляры строк, которые не содержат подстроку «mozilla» (для обратного эффекта, используйте оператор отрицания): -if(browserType.indexOf('mozilla') === -1) { +if(browserType.indexOf('mozilla') === -1) { // сделать что-то, если 'mozilla' // не является частью этой строки } @@ -93,10 +93,10 @@ if(browserType.indexOf('mozilla') !== -1) { }- Когда вы знаете, где подстрока начинается внутри строки, и вы знаете, на каком символе вы хотите её завершить, можно использовать {{jsxref ("String.prototype.slice ()", "slice ()")}} для извлечения. Попробуйте следующее: -
browserType.slice(0,3);+browserType.slice(0,3);Это возвращает «moz». Первым параметром является позиция символа, с которого начинается извлечение, а второй параметр — позиция последнего символа, перед которым нужно отсечь строку. Таким образом, срез происходит с первой позиции, вплоть до последней позиции, но не включая её (помним, что счёт идёт с 0, а не с 1). Также можно сказать, что второй параметр равен длине возвращаемой строки.- Кроме того, если вы знаете, что хотите извлечь все остальные символы в строке после определённого символа, вам не нужно включать второй параметр. Достаточно включить только положение символа, с которого вы хотите начать извлечение оставшихся символов в строке. Введите: -
browserType.slice(2);+browserType.slice(2);Этот код возвращает «zilla» — это потому, что позиция символа 2 — это буква z, и поскольку вы не указали второй параметр, возвращаемая подстрока состояла из всех остальных символов в строке.Попробуем ввести следующие строки, чтобы узнать, что происходит:
-var radData = 'My NaMe Is MuD'; +var radData = 'My NaMe Is MuD'; radData.toLowerCase(); radData.toUpperCase();@@ -120,7 +120,7 @@ radData.toUpperCase();Он принимает два параметра — строку, которую вы хотите заменить, и строку, которую вы хотите вставить вместо заменяемой. Попробуйте этот пример:
-browserType.replace('moz','van');+browserType.replace('moz','van');Обратите внимание, что для фактического получения обновлённого значения, отражённого в переменной browserType в реальной программе, вам нужно будет установить значение переменной в результате операции; он не просто обновляет значение подстроки автоматически. Таким образом, вы должны были бы написать это:
@@ -143,7 +143,7 @@ radData.toUpperCase();browserType = browserType.replace('moz','van');
Playable code
-<h2>Результат</h2> +
-<h2>Результат</h2> <div class="output" style="min-height: 125px;"> @@ -183,7 +183,7 @@ for (var i = 0; i < greetings.length; i++) { <input id="solution" type="button" value="Показать решение"> </div>
html { +
-html { font-family: sans-serif; } @@ -203,7 +203,7 @@ body { background: #f5f9fa; }
var textarea = document.getElementById('code'); +
var textarea = document.getElementById('code'); var reset = document.getElementById('reset'); var solution = document.getElementById('solution'); var code = textarea.value; @@ -301,7 +301,7 @@ textarea.onkeyup = function(){
Playable code 2
-<h2>Результат</h2> +
-<h2>Результат</h2> <div class="output" style="min-height: 125px;"> @@ -334,7 +334,7 @@ for(var i = 0; i < cities.length; i++) { <input id="solution" type="button" value="Показать решение"> </div>
html { +
-html { font-family: sans-serif; } @@ -354,7 +354,7 @@ body { background: #f5f9fa; }
var textarea = document.getElementById('code'); +
var textarea = document.getElementById('code'); var reset = document.getElementById('reset'); var solution = document.getElementById('solution'); var code = textarea.value; @@ -438,11 +438,11 @@ textarea.onkeyup = function(){
В этом последнем упражнении массив содержит кучу строк, содержащих информацию о железнодорожных станциях на севере Англии. Строки представляют собой элементы данных, которые содержат трёхбуквенный код станции, за которым следуют некоторые машиночитаемые данные, за которыми следует точка с запятой, а затем название станции, пригодное для чтения человеком. Например:
-MAN675847583748sjt567654;Manchester Piccadilly+MAN675847583748sjt567654;Manchester PiccadillyМы хотим извлечь код станции и имя и поместить их в строку со следующей структурой:
-MAN: Manchester Piccadilly+MAN: Manchester PiccadillyМы бы рекомендовали реализовать это следующим образом:
@@ -457,7 +457,7 @@ textarea.onkeyup = function(){Playable code 3
-<h2>Результат</h2> +
-<h2>Результат</h2> <div class="output" style="min-height: 125px;"> @@ -495,7 +495,7 @@ for (var i = 0; i < stations.length; i++) { <input id="solution" type="button" value="Показать решение"> </div>
html { +
-html { font-family: sans-serif; } @@ -515,7 +515,7 @@ body { background: #f5f9fa; }
var textarea = document.getElementById('code'); +
var textarea = document.getElementById('code'); var reset = document.getElementById('reset'); var solution = document.getElementById('solution'); var code = textarea.value; diff --git a/files/ru/learn/javascript/first_steps/variables/index.html b/files/ru/learn/javascript/first_steps/variables/index.html index ed8b3966f2..080957c575 100644 --- a/files/ru/learn/javascript/first_steps/variables/index.html +++ b/files/ru/learn/javascript/first_steps/variables/index.html @@ -33,9 +33,9 @@ original_slug: Learn/JavaScript/Первые_шаги/Variables
Переменные — это контейнер для таких значений, как числа, используемые в сложении, или строка, которую мы могли бы использовать как часть предложения. Но одна из особенностей переменных — их значение может меняться. Давайте взглянем на простой пример:
-<button>Нажми на меня</button>+<button>Нажми на меня</button>-const button = document.querySelector('button'); +const button = document.querySelector('button'); button.onclick = function() { let name = prompt('Как вас зовут?'); @@ -48,7 +48,7 @@ button.onclick = function() {Чтобы лучше понять действие переменной здесь, давайте подумаем о том, как мы будем писать этот пример без использования переменной. Это будет выглядеть примерно так:
-var name = prompt('Как вас зовут?'); +var name = prompt('Как вас зовут?'); if (name === 'Адам') { alert('Привет, Адам, рады тебя видеть!'); @@ -78,7 +78,7 @@ if (name === 'Адам') {Чтобы использовать переменную, вы сначала должны её создать, или, если быть точнее, объявить переменную. Чтобы сделать это, мы вводим ключевое слово var, за которым следует имя, которое вы хотите дать своей переменной:
-var myName; +var myName; var myAge;Здесь мы создаём две переменные myName и myAge. Попробуйте ввести эти строки сейчас в консоли вашего веб-браузера или в консоли ниже (можно открыть эту консоль в отдельной вкладке или в новом окне). После этого попробуйте создать переменную (или две) с вашими именами.
@@ -86,7 +86,7 @@ var myAge;Hidden code
-<!DOCTYPE html> +<!DOCTYPE html> <html> <head> <meta charset="utf-8"> @@ -201,12 +201,12 @@ var myAge;Теперь проверим, существуют ли эти значения в среде выполнения. Для этого введём только имя переменной.
-myName; +myName; myAge;В настоящее время они не содержат значения, это пустые контейнеры. В этом случае, когда вы вводите имена переменных, вы должны получить значение
-undefined
. Если они не существуют, вы получите сообщение об ошибке - попробуйте сейчас ввести в консоли имя переменной ниже:scoobyDoo;+scoobyDoo;Примечание: Не путайте переменную, которая существует, но не имеет значения, с переменной, которая вообще не существует - это разные вещи.
@@ -216,17 +216,17 @@ myAge;Как только переменная объявлена, ей можно присвоить значение. Для этого пишется имя переменной, затем следует знак равенства (
-=
), а за ним значение, которое вы хотите присвоить. Например:myName = 'Chris'; +myName = 'Chris'; myAge = 37;Попробуйте вернуться в консоль и ввести эти строки. Вы должны увидеть значение, которое вы назначили переменной, возвращаемой в консоли. Чтобы посмотреть значения переменных, нужно набрать их имя в консоли:
-myName; +myName; myAge;Вы можете объявить переменную и задать ей значение одновременно:
-var myName = 'Chris';+var myName = 'Chris';Скорее всего, так вы будете писать большую часть времени, так как запись и выполнения кода с одно строки происходит быстрее, чем выполнение двух действий на двух отдельных строках.
@@ -238,7 +238,7 @@ myAge;Когда переменной присваивается значение, вы можете изменить (обновить) это значение, просто указав другое значение. Попробуйте ввести следующие строки в консоль:
-myName = 'Bob'; +myName = 'Bob'; myAge = 40;Правила именования переменных
@@ -261,7 +261,7 @@ myAge = 40;Примеры хороших имён переменных:
-age +age myAge init initialColor @@ -272,7 +272,7 @@ audio2Примеры плохих имён переменных:
-1 +1 a _12 myage @@ -284,7 +284,7 @@ thisisareallylongstupidvariablenamemanПримеры имён переменных, которые вызовут ошибки:
-var +var Document@@ -298,23 +298,23 @@ DocumentВы можете хранить числа в переменных (целые числа, такие как 30, или десятичные числа, такие как 2.456, также называемые числами с плавающей точкой или с плавающей запятой). Вам не нужно объявлять типы переменных в JavaScript, в отличие от некоторых других языков программирования Если давать переменной значение числа,кавычки не используются:
-var myAge = 17;+var myAge = 17;Строки ('Strings')
Строки - это фрагменты текста. Когда вы даёте переменной значение строки, вам нужно обернуть её в одиночные или двойные кавычки, в противном случае JavaScript попытается проиндексировать её как другое имя переменной.
-var dolphinGoodbye = 'So long and thanks for all the fish';+var dolphinGoodbye = 'So long and thanks for all the fish';Логические (Booleans)
Booleans - истинные / ложные значения - они могут иметь два значения: true или false. Они обычно используются для проверки состояния, после чего код запускается соответствующим образом. Вот простой пример:
-var iAmAlive = true;+var iAmAlive = true;В действительности вы чаще будете использовать этот тип переменных так:
-var test = 6 < 3; +var test = 6 < 3;Здесь используется оператор «меньше» (<), чтобы проверить, является ли 6 меньше 3. В данном примере, он вернёт false, потому что 6 не меньше 3! В дальнейшем вы узнаете больше о таких операторах.
@@ -323,12 +323,12 @@ DocumentМассив - это один объект, который содержит несколько значений, заключённых в квадратные скобки и разделённых запятыми. Попробуйте ввести следующие строки в консоль:
-var myNameArray = ['Chris', 'Bob', 'Jim']; +var myNameArray = ['Chris', 'Bob', 'Jim']; var myNumberArray = [10,15,40];Как только эти массивы определены, можно получить доступ к каждому значению по их местоположению в массиве. Наберите следующие строки:
-myNameArray[0]; // should return 'Chris' +myNameArray[0]; // should return 'Chris' myNumberArray[2]; // should return 40Квадратные скобки указывают значение индекса, соответствующее позиции возвращаемого значения. Возможно, вы заметили, что массивы в JavaScript индексируются с нулевой отметкой: первый элемент имеет индекс 0.
@@ -341,11 +341,11 @@ myNumberArray[2]; // should return 40Попробуйте ввести следующую строку в консоль:
-var dog = { name : 'Spot', breed : 'Dalmatian' };+var dog = { name : 'Spot', breed : 'Dalmatian' };Чтобы получить информацию, хранящуюся в объекте, вы можете использовать следующий синтаксис:
-dog.name+dog.nameМы больше не будем рассматривать объекты в данном курсе - вы можете больше узнать о них в будущем модуле.
@@ -355,11 +355,11 @@ myNumberArray[2]; // should return 40Например, если вы объявите переменную и присвоите ей значение, заключённое в кавычки, браузер будет обрабатывать переменную как строку:
-var myString = 'Привет';+var myString = 'Привет';Он всё равно будет строкой, даже если он содержит числа, поэтому будьте осторожны:
-var myNumber = '500'; // упс, это все ещё строка (string) +var myNumber = '500'; // упс, это все ещё строка (string) typeof(myNumber); myNumber = 500; // так-то лучше, теперь это число (number) typeof(myNumber);diff --git a/files/ru/learn/javascript/objects/basics/index.html b/files/ru/learn/javascript/objects/basics/index.html index 0c8b3f6a5e..453f1ca169 100644 --- a/files/ru/learn/javascript/objects/basics/index.html +++ b/files/ru/learn/javascript/objects/basics/index.html @@ -34,15 +34,15 @@ original_slug: Learn/JavaScript/Объекты/ОсновыКак и во многих случаях в JavaScript, создание объекта часто начинается с определения и инициализации переменной. Попробуйте ввести следующий код JavaScript в ваш файл, а затем сохраните файл и обновите страницу браузера:
-const person = {};+const person = {};Если вы введёте
-person
в текстовое JS консоль и нажмёте клавишу Enter, должен получиться следующий результат:+Object
{ }
Object
{ }
Поздравляем, вы только что создали ваш первый объект. Но это пустой объект, поэтому мы не можем с ним ничего сделать. Давайте обновим наш объект, чтобы он выглядел так:
-const person = { +const person = { name: ['Bob', 'Smith'], age: 32, gender: 'male', @@ -58,7 +58,7 @@ original_slug: Learn/JavaScript/Объекты/ОсновыПосле сохранения и обновления, попробуйте ввести что-нибудь следующее в консоль JavaScript браузера:
-person.name
+person.name
person.name[0] person.age person.interests[1] @@ -73,7 +73,7 @@ person.greeting()Итак что здесь происходит? Объект состоит из нескольких элементов, каждый из которых имеет своё название (пример
-name
иage
выше), и значение (пример['Bob', 'Smith']
и32
). Каждая пара название/значение должны быть разделены запятой, а название и значение в каждом случае разделяются двоеточием. Синтаксис всегда следует этому образцу:const objectName = { +const objectName = { member1Name: member1Value, member2Name: member2Value, member3Name: member3Value @@ -89,7 +89,7 @@ person.greeting()Выше вы получили доступ к свойствам и методам используя точечную запись (dot notation). Имя объекта (person) действует как пространство имён (namespace) — оно должно быть введено первым, для того чтобы получить доступ ко всему что заключено (encapsulated) внутри объекта. Далее вы пишете точку, затем элемент, к которому хотите получить доступ — это может быть имя простого свойства, элемент массива, или вызов одного из методов объекта, например:
-person.age +person.age person.interests[1] person.bio()@@ -97,28 +97,28 @@ person.bio()Можно даже сделать значением элемента объекта другой объект. Например, попробуйте изменить значение свойства name с такого
-name: ['Bob', 'Smith'],+name: ['Bob', 'Smith'],на такое
-name : { +name : { first: 'Bob', last: 'Smith' },Здесь мы фактически создаём внутреннее пространство имён (sub-namespace). Это звучит сложно, но на самом деле это не так — для доступа к этим элементам вам нужно сделать один дополнительный шаг с ещё одной точкой. Попробуйте в консоли браузера следующее:
-person.name.first +person.name.first person.name.lastВажно: На этом этапе вам также нужно будет пересмотреть код метода и изменить все экземпляры с
-name[0] +name[0] name[1]на
-name.first +name.first name.lastИначе ваши методы больше не будут работать.
@@ -127,12 +127,12 @@ name.lastСуществует другой способ получить свойства объекта — использовать скобочную запись (bracket notation). Вместо написания этого кода:
-person.age +person.age person.name.firstВы можете использовать следующий
-person['age'] +person['age'] person['name']['first']Это выглядит очень похоже на то, как вы получаете элементы массива, и в принципе это так и есть — вместо использования числовых индексов для выбора элемента, вы ассоциируете имя свойства для каждого значения. Ничего удивительного, что эти объекты иногда называют ассоциативными массивами — они сопоставляют строки со значениями так же, как массивы сопоставляют числовые индексы со значениями.
@@ -141,42 +141,42 @@ person['name']['first']До сих пор мы рассматривали только возврат (или получение) элементов объекта — вы так же можете установить (обновить) значение элемента объекта просто объявив элемент, который вы хотите установить (используя точечную или скобочную запись), например:
-person.age = 45; +person.age = 45; person['name']['last'] = 'Cratchit';Попробуйте ввести эти строки, а затем снова верните элементы, чтобы увидеть, как они изменились
-person.age +person.age person['name']['last']Вы можете не просто обновлять и устанавливать значения свойств и методов объекта, а так же устанавливать совершенно новые элементы. Попробуйте их в консоли JS:
-person['eyes'] = 'hazel'; +person['eyes'] = 'hazel'; person.farewell = function() { alert("Bye everybody!"); }Теперь вы можете проверить ваши новые элементы:
-person['eyes'] +person['eyes'] person.farewell()Одним из полезных аспектов скобочной записи является то, что с её помощью можно динамически задавать не только значения элементов, но и их имена. Предположим, что мы хотим, чтобы пользователи могли хранить пользовательские типы данных, введя имя и значение элемента в два следующих поля? Мы могли бы получить эти значения следующим образом:
-let myDataName = nameInput.value; +let myDataName = nameInput.value; let myDataValue = nameValue.value;Затем мы можем добавить имя и значение этого нового элемента в объект
-person
таким образом:person[myDataName] = myDataValue;+person[myDataName] = myDataValue;Чтобы проверить это, попробуйте добавить следующие строки в свой код, после закрывающей скобки объекта
-person
:let myDataName = 'height'; +let myDataName = 'height'; let myDataValue = '1.75m'; person[myDataName] = myDataValue;Теперь попробуйте сохранить и обновить, затем введите следующее в консоль браузера:
-person.height+person.heightДобавление свойства объекта с использованием вышеописанного метода невозможно с использованием точечной записи, которая может принимать только литеральное имя элемента, а не значение переменной указывающее на имя.
@@ -184,7 +184,7 @@ person[myDataName] = myDataValue;Возможно, вы заметили что-то странное в наших методах. Посмотрите на этот пример:
-greeting: function() { +greeting: function() { alert('Hi! I\'m ' + this.name.first + '.'); }@@ -192,7 +192,7 @@ person[myDataName] = myDataValue;Давайте проиллюстрируем, что мы имеем в виду, с упрощённой парой объектов
-person
:const person1 = { +const person1 = { name: 'Chris', greeting: function() { alert('Hi! I\'m ' + this.name + '.'); @@ -214,13 +214,13 @@ const person2 = {Поэтому, когда вы использовали строковые методы, такие как:
-myString.split(',');+myString.split(',');Вы использовали метод доступный в экземпляре класса
String
. Каждый раз создавая строку в вашем коде, эта строка автоматически создаётся как экземплярString
, и поэтому имеет несколько общих методов/свойств, доступных на нем.Когда вы обращались к объектной модели документа (DOM), используя следующие строки:
-const myDiv = document.createElement('div'); +const myDiv = document.createElement('div'); const myVideo = document.querySelector('video');Вы использовали методы доступные в экземпляре класса
@@ -229,7 +229,7 @@ const myVideo = document.querySelector('video');Document
. Для каждой загруженной веб-страницы создаётся экземплярDocument
, называемыйdocument
, который представляет всю структуру страницы, её содержимое и другие функции, такие как URL-адрес. Опять же, это означает, что он имеет несколько общих методов/свойств, доступных на нем.Обратите внимание, что встроенные объекты/API не всегда создают экземпляры объектов автоматически. Как пример, Notifications API — который позволяет новым браузерам запускать системные уведомления, требует, чтобы вы создавали новый экземпляр объекта с помощью конструктора для каждого уведомления, которое вы хотите запустить. Попробуйте ввести следующее в консоль JavaScript:
-const myNotification = new Notification('Hello!');+const myNotification = new Notification('Hello!');Опять же, мы рассмотрим конструкторы в следующей статье.
diff --git a/files/ru/learn/javascript/objects/inheritance/index.html b/files/ru/learn/javascript/objects/inheritance/index.html index 97e9a98fbd..f1514a92c6 100644 --- a/files/ru/learn/javascript/objects/inheritance/index.html +++ b/files/ru/learn/javascript/objects/inheritance/index.html @@ -57,7 +57,7 @@ original_slug: Learn/JavaScript/Объекты/InheritanceПрежде всего сделайте себе локальную копию нашего файла oojs-class-inheritance-start.html (он также работает в режиме реального времени). В файле вы найдёте тот же пример конструктора
-Person()
, который мы использовали на протяжении всего модуля, с небольшим отличием - мы определили внутри конструктора только лишь свойства:function Person(first, last, age, gender, interests) { +function Person(first, last, age, gender, interests) { this.name = { first, last @@ -69,7 +69,7 @@ original_slug: Learn/JavaScript/Объекты/InheritanceВсе методы определены в прототипе конструктора. Например:
-Person.prototype.greeting = function() { +Person.prototype.greeting = function() { alert('Hi! I\'m ' + this.name.first + '.'); };@@ -88,7 +88,7 @@ original_slug: Learn/JavaScript/Объекты/InheritanceПервое, что нам нужно сделать, это создать конструктор
-Teacher()
- добавьте ниже следующий код:function Teacher(first, last, age, gender, interests, subject) { +function Teacher(first, last, age, gender, interests, subject) { Person.call(this, first, last, age, gender, interests); this.subject = subject; @@ -102,7 +102,7 @@ original_slug: Learn/JavaScript/Объекты/InheritanceВ качестве примечания мы могли бы просто сделать это:
-function Teacher(first, last, age, gender, interests, subject) { +function Teacher(first, last, age, gender, interests, subject) { this.name = { first, last @@ -119,14 +119,14 @@ original_slug: Learn/JavaScript/Объекты/InheritanceОбратите внимание, что если конструктор, от которого вы наследуете, не принимает значения своего свойства из параметров, вам не нужно указывать их в качестве дополнительных аргументов в
-call()
. Так, например, если у вас было что-то действительно простое:function Brick() { +function Brick() { this.width = 10; this.height = 20; }Вы можете наследовать свойства
-width
иheight
, выполнив это (как и другие шаги, описанные ниже, конечно):function BlueGlassBrick() { +function BlueGlassBrick() { Brick.call(this); this.opacity = 0.5; @@ -141,11 +141,11 @@ original_slug: Learn/JavaScript/Объекты/Inheritance
- Добавьте следующую строку ниже своего предыдущего добавления: -
Teacher.prototype = Object.create(Person.prototype);+Teacher.prototype = Object.create(Person.prototype);Здесь наш другcreate()
снова приходит на помощь. В этом случае мы используем его для создания нового объекта и делаем его значениемTeacher.prototype
. Новый объект имеет свой прототипPerson.prototype
и, следовательно, наследует, если и когда это необходимо, все доступные методыPerson.prototype
.- Нам нужно сделать ещё одну вещь, прежде чем двигаться дальше. После добавления последней строки,
Teacher.prototype.constructor
стало равнымPerson()
, потому что мы просто устанавливаемTeacher.prototype
для ссылки на объект, который наследует его свойства отPerson.prototype
! Попробуйте сохранить код, загрузите страницу в браузере и введитеTeacher.prototype.constructor
в консоль для проверки.- Это может стать проблемой, поэтому нам нужно сделать это правильно. Вы можете сделать это, вернувшись к исходному коду и добавив следующие строки внизу: -
Object.defineProperty(Teacher.prototype, 'constructor', { +
@@ -159,7 +159,7 @@ original_slug: Learn/JavaScript/Объекты/InheritanceObject.defineProperty(Teacher.prototype, 'constructor', { value: Teacher, enumerable: false, // false, чтобы данное свойство не появлялось в цикле for in writable: true });
Самый простой способ сделать это - определить его на прототипе
-Teacher()
- добавить в нижнюю часть кода следующее:Teacher.prototype.greeting = function() { +Teacher.prototype.greeting = function() { var prefix; if (this.gender === 'male' || this.gender === 'Male' || this.gender === 'm' || this.gender === 'M') { @@ -179,11 +179,11 @@ original_slug: Learn/JavaScript/Объекты/InheritanceТеперь, когда вы ввели весь код, попробуйте создать экземпляр объекта из
-Teacher()
, поставив ниже вашего JavaScript-кода (или что-то похожее по вашему выбору):var teacher1 = new Teacher('Dave', 'Griffiths', 31, 'male', ['football', 'cookery'], 'mathematics');+var teacher1 = new Teacher('Dave', 'Griffiths', 31, 'male', ['football', 'cookery'], 'mathematics');Теперь сохраните, обновите, и попробуйте получить доступ к свойствам и методам вашего нового объекта
-teacher1
, например:teacher1.name.first; +teacher1.name.first; teacher1.interests[0]; teacher1.bio(); teacher1.subject; diff --git a/files/ru/learn/javascript/objects/object-oriented_js/index.html b/files/ru/learn/javascript/objects/object-oriented_js/index.html index 7fe8592651..409aa367f2 100644 --- a/files/ru/learn/javascript/objects/object-oriented_js/index.html +++ b/files/ru/learn/javascript/objects/object-oriented_js/index.html @@ -87,7 +87,7 @@ original_slug: Learn/JavaScript/Объекты/Object-oriented_JS
- Давайте рассмотрим как можно определить человека с нормальной функцией. Добавьте эту функцию в элемент
script
: -function createNewPerson(name) { +function createNewPerson(name) { const obj = {}; obj.name = name; obj.greeting = function() { @@ -97,12 +97,12 @@ original_slug: Learn/JavaScript/Объекты/Object-oriented_JS }- Теперь вы можете создать нового человека, вызвав эту функцию - попробуйте следующие строки в консоли JavaScript браузера: -
const salva = createNewPerson('Salva'); +const salva = createNewPerson('Salva'); salva.name; salva.greeting();Это работает достаточно хорошо, но код излишне многословен; если мы знаем, что хотим создать объект, зачем нам явно создавать новый пустой объект и возвращать его? К счастью, JavaScript предоставляет нам удобный способ в виде функций-конструкторов - давайте сделаем это сейчас!- Замените предыдущую функцию следующей: -
function Person(name) { +function Person(name) { this.name = name; this.greeting = function() { alert('Hi! I\'m ' + this.name + '.'); @@ -121,11 +121,11 @@ salva.greeting();
- Добавьте следующие строки под предыдущим добавлением кода: -
let person1 = new Person('Bob'); +let person1 = new Person('Bob'); let person2 = new Person('Sarah');- Сохраните код и перезагрузите его в браузере и попробуйте ввести следующие строки в консоль JS: -
person1.name +person1.name person1.greeting() person2.name person2.greeting()@@ -136,12 +136,12 @@ person2.greeting()Давайте снова посмотрим на вызовы конструктора:
-let person1 = new Person('Bob'); +let person1 = new Person('Bob'); let person2 = new Person('Sarah');В каждом случае ключевое слово
-new
используется, чтобы сообщить браузеру, что мы хотим создать экземпляр нового объекта, за которым следует имя функции с её необходимыми параметрами, содержащимися в круглых скобках, и результат сохраняется в переменной - очень похоже на то, как вызывается стандартная функция. Каждый экземпляр создаётся в соответствии с этим определением:function Person(name) { +function Person(name) { this.name = name; this.greeting = function() { alert('Hi! I\'m ' + this.name + '.'); @@ -150,7 +150,7 @@ let person2 = new Person('Sarah');После создания новых объектов переменные
-person1
иperson2
содержат следующие объекты:{ +{ name: 'Bob', greeting: function() { alert('Hi! I\'m ' + this.name + '.'); @@ -172,7 +172,7 @@ let person2 = new Person('Sarah');
- Замените весь предыдущий код новой функцией конструктора - это, в принципе, тот же самое что и в наглядном примере, но несколько сложнее: -
function Person(first, last, age, gender, interests) { +function Person(first, last, age, gender, interests) { this.name = { first : first, last: last @@ -189,13 +189,13 @@ let person2 = new Person('Sarah');};- Теперь добавьте следующую строку ниже, чтобы создать экземпляр объекта из него: -
let person1 = new Person('Bob', 'Smith', 32, 'male', ['music', 'skiing']);+let person1 = new Person('Bob', 'Smith', 32, 'male', ['music', 'skiing']);Как вы могли заметить, вы можете получить доступ к свойствам и методам, как это было ранее, - попробуйте использовать их в консоли JS:
-person1['age'] +person1['age'] person1.interests[1] person1.bio() // etc.@@ -224,17 +224,17 @@ person1.bio()
- Попробуйте ввести это в консоль JavaScript вашего браузера: -
let person1 = new Object();+let person1 = new Object();- Это сохраняет ссылку на пустой объект в переменную
person1
. Затем вы можете добавить свойства и методы к этому объекту с использованием точечной или скобочной нотации по желанию; попробуйте эти примеры в консоли: -person1.name = 'Chris'; +person1.name = 'Chris'; person1['age'] = 38; person1.greeting = function() { alert('Hi! I\'m ' + this.name + '.'); };- Вы также можете передать литерал объекта конструктору
Object()
в качестве параметра, чтобы заполнить его свойствами / методами. Попробуйте это в консоли JS: -let person1 = new Object({ +let person1 = new Object({ name: 'Chris', age: 38, greeting: function() { @@ -252,10 +252,10 @@ person1.greeting = function() {diff --git a/files/ru/learn/javascript/objects/object_building_practice/index.html b/files/ru/learn/javascript/objects/object_building_practice/index.html index 155d130c77..283ee36001 100644 --- a/files/ru/learn/javascript/objects/object_building_practice/index.html +++ b/files/ru/learn/javascript/objects/object_building_practice/index.html @@ -49,7 +49,7 @@ original_slug: Learn/JavaScript/Объекты/Object_building_practice
- Закончив упражнение из предыдущего раздела, загруженное в браузер, попробуйте это в консоли JavaScript: -
let person2 = Object.create(person1);+let person2 = Object.create(person1);- Теперь попробуйте: -
person2.name +person2.name person2.greeting()Первая часть скрипта выглядит так:
-var canvas = document.querySelector('canvas'); +var canvas = document.querySelector('canvas'); var ctx = canvas.getContext('2d'); @@ -64,7 +64,7 @@ var height = canvas.height = window.innerHeight;Последний бит исходного скрипта выглядит следующим образом:
-function random(min, max) { +function random(min, max) { var num = Math.floor(Math.random() * (max - min + 1)) + min; return num; }@@ -75,7 +75,7 @@ var height = canvas.height = window.innerHeight;В нашей программе будет много шаров, подпрыгивающих вокруг экрана. Поскольку эти шары будут вести себя одинаково, имеет смысл представлять их в виде объекта. Начнём с добавления следующего конструктора в конец нашего кода.
-function Ball(x, y, velX, velY, color, size) { +function Ball(x, y, velX, velY, color, size) { this.x = x; this.y = y; this.velX = velX; @@ -99,7 +99,7 @@ var height = canvas.height = window.innerHeight;Сначала добавьте следующий метод
-draw()
кBall()
'sprototype
:Ball.prototype.draw = function() { +Ball.prototype.draw = function() { ctx.beginPath(); ctx.fillStyle = this.color; ctx.arc(this.x, this.y, this.size, 0, 2 * Math.PI); @@ -127,10 +127,10 @@ var height = canvas.height = window.innerHeight;- Сохраните код и загрузите HTML-файл в браузер.
- Откройте консоль JavaScript браузера, а затем обновите страницу, чтобы размер холста изменился в соответствии с новой шириной и высотой окна просмотра браузера после открытия консоли.
- Чтобы создать новый экземпляр шара, введите следующее: -
var testBall = new Ball(50, 100, 4, 4, 'blue', 10);+var testBall = new Ball(50, 100, 4, 4, 'blue', 10);- Попробуйте вызвать его свойства и методы: -
testBall.x +testBall.x testBall.size testBall.color testBall.draw()@@ -142,7 +142,7 @@ testBall.draw()Мы можем нарисовать мяч в нужном положении, но чтобы начать движение мяча, нам нужна функция обновления. Добавьте следующий код внизу вашего файла JavaScript, чтобы добавить метод
-update()
кBall()
'sprototype
:Ball.prototype.update = function() { +Ball.prototype.update = function() { if ((this.x + this.size) >= width) { this.velX = -(this.velX); } @@ -186,12 +186,12 @@ testBall.draw()@@ -238,7 +238,7 @@ testBall.draw()
- Во-первых, нам нужно где-то хранить все наши шары. Следующий массив выполнит это задание - добавьте его внизу кода: -
var balls = [];+var balls = [];Все программы, которые оживляют вещи, обычно включают цикл анимации, который служит для обновления информации в программе, а затем визуализации результирующего представления для каждого кадра анимации; это основа для большинства игр и других подобных программ.
- Добавьте ниже эту часть кода: -
function loop() { +function loop() { ctx.fillStyle = 'rgba(0, 0, 0, 0.25)'; ctx.fillRect(0, 0, width, height); @@ -225,7 +225,7 @@ testBall.draw()- И последнее, но не менее важное: добавьте следующую строку в конец вашего кода - нам нужно вызвать функцию один раз, чтобы начать анимацию. -
loop();+loop();-- cgit v1.2.3-54-g00ecf
- Прежде всего, добавьте следующее определение метода ниже, где вы определили метод
update()
(т.е. блокBall.prototype.update
). -Ball.prototype.collisionDetect = function() { +Ball.prototype.collisionDetect = function() { for (var j = 0; j < balls.length; j++) { if (!(this === balls[j])) { var dx = this.x - balls[j].x; @@ -262,7 +262,7 @@ testBall.draw()- Вы также должны вызвать этот метод в каждом кадре анимации. Добавьте следующий код после строки
balls[i].update();
-balls[i].collisionDetect();+balls[i].collisionDetect();- Сохраните и обновите демо снова, и вы увидите, как ваши мячи меняют цвет, когда они сталкиваются!