Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
133 changes: 67 additions & 66 deletions 1-js/02-first-steps/02-structure/article.md
Original file line number Diff line number Diff line change
@@ -1,159 +1,160 @@
# Code structure
# Kod Strukturu

The first thing we'll study is the building blocks of code.
İlk öyrənəcəyimiz mövzu, kodun bloklarını inşa etməkdir.

## Statements
## İfadələr

Statements are syntax constructs and commands that perform actions.
İfadələr sintaksis konstruksiyaları və əmrlərdir ki, müəyyən əməliyyatlar yerinə yetirir.

We've already seen a statement, `alert('Hello, world!')`, which shows the message "Hello, world!".
Biz artıq alert('Salam, Dünya!') ilə bir ifadə görmüşük, ki, bu da bizə "Salam, Dünya!" mesajını göstərir.

We can have as many statements in our code as we want. Statements can be separated with a semicolon.
Kodumuzda istədiyimiz qədər ifadə ola bilər. İfadələr bir-birindən "nöqtəli vergül"lərlə ayrıla bilər.

For example, here we split "Hello World" into two alerts:
Məsələn, burada "Salam, dünya" mesajını iki xəbərdarlıq şəklində ayırmışıq:

```js run no-beautify
alert('Hello'); alert('World');
alert('Salam'); alert('Dünya');
```

Usually, statements are written on separate lines to make the code more readable:
Adətən, ifadələr kodun oxunaqlılığını artırmaq üçün ayrı-ayrı sətirlərdə yazılır:

```js run no-beautify
alert('Hello');
alert('World');
alert('Salam');
alert('Dünya');
```

## Semicolons [#semicolon]
## Nöqtəli Vergüllər [#semicolon]

A semicolon may be omitted in most cases when a line break exists.
Sətir sonunda bir çox hallarda nöqtəli vergül buraxıla bilər.

This would also work:
Bu da işləyəcək:

```js run no-beautify
alert('Hello')
alert('World')
alert('Salam')
alert('Dünya')
```

Here, JavaScript interprets the line break as an "implicit" semicolon. This is called an [automatic semicolon insertion](https://tc39.github.io/ecma262/#sec-automatic-semicolon-insertion).
Burada JavaScript interpretatoru sətir sonunu "örtülü" nöqtəli vergül kimi qəbul edir. Bu proses [avtomatik nöqtəli vergül daxil edilməsi (automatic semicolon insertion)](https://tc39.github.io/ecma262/#sec-automatic-semicolon-insertion) adlanır.

**In most cases, a newline implies a semicolon. But "in most cases" does not mean "always"!**
**Əksər hallarda yeni sətir nöqtəli vergül əlavə edildiyini ifadə edir. Amma "əksər hallarda" "hər zaman" demək deyil!**

There are cases when a newline does not mean a semicolon. For example:
Müəyyən hallar var ki, yeni sətir nöqtəli vergül anlamına gəlmir. Məsələn:

```js run no-beautify
alert(3 +
1
+ 2);
```

The code outputs `6` because JavaScript does not insert semicolons here. It is intuitively obvious that if the line ends with a plus `"+"`, then it is an "incomplete expression", so the semicolon is not required. And in this case that works as intended.
Bu kodun nəticəsi `6` olacaq, çünki, JavaScript interpretatoru burada nöqtəli vergül daxil etmir. JavaScript üçün intuitiv olaraq aydındır ki, əgər sətir `+` (üstəgəl) simvolu ilə bitirsə, bu "natamam ifadə"dir və nöqtəli vergül tələb olunmur. Bu halda kod gözlənildiyi kimi işləyir.

**But there are situations where JavaScript "fails" to assume a semicolon where it is really needed.**
**Amma müəyyən hallar da var ki, JavaScript belə hallarda nöqtəli vergülü avtomatik əlavə edə bilmir və nəticədə xəta yaranır.**

Errors which occur in such cases are quite hard to find and fix.
Belə hallarda xətaları tapmaq və düzəltmək olduqca çətin ola bilər.

````smart header="An example of an error"
If you're curious to see a concrete example of such an error, check this code out:
````smart header="Xəta üçün bir nümunə"
Əgər belə bir xətaya konkret nümunə görmək istəyirsinizsə, bu kodu yoxlayın:

```js run
[1, 2].forEach(alert)
```

No need to think about the meaning of the brackets `[]` and `forEach` yet. We'll study them later. For now, just remember the result of the code: it shows `1` then `2`.
İndilik `[]` (kvadrat mötərizələr) və `forEach` haqqında düşünməyə ehtiyac yoxdur. Onları daha sonra öyrənəcəyik. Hazırda sadəcə kodun nəticəsinə diqqət edin: bu kod əvvəlcə `1`, daha sonra `2` göstərir.

Now, let's add an `alert` before the code and *not* finish it with a semicolon:
İndi kodun əvvəlinə bir `alert` əlavə edək və onu nöqtəli vergülsüz bitirək:

```js run no-beautify
alert("There will be an error")
alert("Xəta baş verəcək")

[1, 2].forEach(alert)
```

Now if we run the code, only the first `alert` is shown and then we have an error!
İndi bu kodu işə salsaq, yalnız ilk `alert` mesajı görünəcək və daha sonra xəta ilə üzləşəcəyik!

But everything is fine again if we add a semicolon after `alert`:
Amma əgər `alert` ifadəsindən sonra nöqtəli vergül əlavə etsək, hər şey yenidən qaydasında olacaq:
```js run
alert("All fine now");
alert("Hər şey qaydasındadır.");

[1, 2].forEach(alert)
```

Now we have the "All fine now" message followed by `1` and `2`.
İndi "Hər şey qaydasındadır." mesajından sonra `1` `2` görünür.


The error in the no-semicolon variant occurs because JavaScript does not assume a semicolon before square brackets `[...]`.
Nöqtəli vergülün olmadığı variantda xəta JavaScript'in kvadrat mötərizədən əvvəl nöqtəli vergülü avtomatik əlavə edə bilməməsindən qaynaqlanır.

So, because the semicolon is not auto-inserted, the code in the first example is treated as a single statement. Here's how the engine sees it:
Beləliklə, nöqtəli vergül avtomatik olaraq əlavə edilmədiyindən, ilk nümunədəki kod tək ifadə kimi qəbul olunur. JavaScript mühərriki kodu belə görür:

```js run no-beautify
alert("There will be an error")[1, 2].forEach(alert)
alert("Xəta baş verəcək")[1, 2].forEach(alert)
```

But it should be two separate statements, not one. Such a merging in this case is just wrong, hence the error. This can happen in other situations.
Amma kod iki ayrı ifadə olmalı idi, tək deyil. Bu halda birləşmə səhv baş verir və nəticədə xəta yaranır. Bu problem digər hallarda da yarana bilər.
````

We recommend putting semicolons between statements even if they are separated by newlines. This rule is widely adopted by the community. Let's note once again -- *it is possible* to leave out semicolons most of the time. But it's safer -- especially for a beginner -- to use them.
Əgər ifadələr sətirlərlə ayrılıbsa, onların arasına nöqtəli vergül qoymağı tövsiyə edirik. Bu qayda JavaScript cəmiyyəti tərəfindən geniş şəkildə qəbul olunub. Yenidən bir də qeyd edək ki, nöqtəli vergülləri çox vaxt buraxmaq -- *mümkündür*. Lakin, xüsusilə yeni başlayanlar üçün, nöqtəli vergüllərdən istifadə etmək daha təhlükəsizdir.

## Comments [#code-comments]
## Şərhlər [#code-comments]

As time goes on, programs become more and more complex. It becomes necessary to add *comments* which describe what the code does and why.
Zaman keçdikcə proqramlar daha mürəkkəb hala gələ bilər. Bu zaman kodun nə etdiyini və niyə olduğunu izah edən *şərhlər* əlavə etmək lazım olur.

Comments can be put into any place of a script. They don't affect its execution because the engine simply ignores them.
Şərhləri skriptin istənilən yerində yerləşdirmək olar. Onlar kodun icrasına təsir etmir, çünki, JavaScript mühərriki onları sadəcə nəzərə almır.

**One-line comments start with two forward slash characters `//`.**
**Təksətirlik şərhlər iki ardıcıl slash (`//`) ilə başlayır.**

The rest of the line is a comment. It may occupy a full line of its own or follow a statement.
Sətirin qalan hissəsi şərh hesab olunur. Şərhlər ayrıca bir sətri tuta bilər və ya bir ifadəni izləyə bilər.

Like here:
Məsələn:
```js run
// This comment occupies a line of its own
alert('Hello');
// Bu şərh ayrıca bir sətirdə yerləşir
alert('Salam');

alert('World'); // This comment follows the statement
alert('Dünya'); // Bu şərh ifadədən sonra yerləşir
```

**Multiline comments start with a forward slash and an asterisk <code>/&#42;</code> and end with an asterisk and a forward slash <code>&#42;/</code>.**
**Çoxsətirli şərhlər bir slash (`/`) və asterisk (`*`) ilə başlayır <code>/&#42;</code> və bir asterisk (`*`) və slash (`/`) ilə bitir <code>&#42;/</code>.**

Like this:
Məsələn:

```js run
/* An example with two messages.
This is a multiline comment.
/* İki mesaj ehtiva edən bir nümunə.
Bu çoxsətirli bir şərhdir.
*/
alert('Hello');
alert('World');
alert('Salam');
alert('Dünya');
```

The content of comments is ignored, so if we put code inside <code>/&#42; ... &#42;/</code>, it won't execute.
Şərhlərin məzmunu JavaScript mühərriki tərəfindən nəzərə alınmadığı üçün, əgər kodu <code>/&#42; ... &#42;/</code> içərisində yerləşdirsək, o icra olunmayacaq.

Sometimes it can be handy to temporarily disable a part of code:
Bəzən kodun müəyyən bir hissəsini müvəqqəti olaraq söndürmək üçün şərhlərdən istifadə etmək faydalıdır:

```js run
/* Commenting out the code
alert('Hello');
/* Kodu deaktiv edirik
alert('Salam');
*/
alert('World');
alert('Dünya');
```

```smart header="Use hotkeys!"
In most editors, a line of code can be commented out by pressing the `key:Ctrl+/` hotkey for a single-line comment and something like `key:Ctrl+Shift+/` -- for multiline comments (select a piece of code and press the hotkey). For Mac, try `key:Cmd` instead of `key:Ctrl`.
```smart header="Qısayollardan istifadə edin!"
Əksər redaktorlarda bir kod sətrini təksətirlik şərh etmək üçün `key:Ctrl+/` qısayolundan, çoxsətirli şərhlər üçün isə (kodun bir hissəsini seçib) `key:Ctrl+Shift+/` kombinasiyasından istifadə edə bilərsiniz. Mac istifadəçiləri, sözügedən kombinasiyalardan istifadədə key:Ctrl əvəzinə key:Cmd klavişiylə cəhd edə bilərlər.
```

````warn header="Nested comments are not supported!"
There may not be `/*...*/` inside another `/*...*/`.
````warn header="İç-içə şərhlər dəstəklənmir!"
`/*...*/` içərisində başqa bir `/*...*/` şərhi yerləşdirilə bilməz.

Such code will die with an error:
Belə bir kod xəta ilə nəticələnir:

```js run no-beautify
/*
/* nested comment ?!? */
/* İç-içə şərh ?!? */
*/
alert( 'World' );
alert('Dünya');
```
````

Please, don't hesitate to comment your code.
Kodunuzu şərh etməkdən çəkinməyin.

Comments increase the overall code footprint, but that's not a problem at all. There are many tools which minify code before publishing to a production server. They remove comments, so they don't appear in the working scripts. Therefore, comments do not have negative effects on production at all.
Şərhlər ümumi kodun ölçüsünü artırır, lakin bu problem deyil. Bir çox alət kodu "production server"da, yəni istehsal serverində yayımlamadan əvvəl kiçildir. Bu prosesdə şərhlər silinir və işlək skriptlərdə yer almır. Buna görə də şərhlərin istehsal serverinə heç bir mənfi təsiri yoxdur.

Later in the tutorial there will be a chapter <info:code-quality> that also explains how to write better comments.
Daha sonra bu dərslikdə [Kod keyfiyyəti](<info:code-quality>) adlı bir fəsil olacaq. Bu fəsil daha yaxşı şərhlər yazmaq barədə əlavə
məsləhətlər verəcək.
73 changes: 36 additions & 37 deletions 1-js/02-first-steps/03-strict-mode/article.md
Original file line number Diff line number Diff line change
@@ -1,85 +1,84 @@
# The modern mode, "use strict"
# Müasir Rejim, "use strict"

For a long time, JavaScript evolved without compatibility issues. New features were added to the language while old functionality didn't change.
JavaScript uzun müddət ərzində uyğunsuzluq problemləri olmadan inkişaf etdi. Köhnə xüsusiyyətlər dəyişdirilmədən, dilə yeni xüsusiyyətlər əlavə olundu.

That had the benefit of never breaking existing code. But the downside was that any mistake or an imperfect decision made by JavaScript's creators got stuck in the language forever.
Bunun üstünlüyü mövcud kodun işləmə qabiliyyətini heç vaxt pozmaması idi. Lakin mənfi tərəfi o idi ki, JavaScript'in yaradıcılarının etdiyi hərhansı bir səhv və ya düzgün olmayan bir qərar dilin daimi bir hissəsinə çevrilirdi.

This was the case until 2009 when ECMAScript 5 (ES5) appeared. It added new features to the language and modified some of the existing ones. To keep the old code working, most such modifications are off by default. You need to explicitly enable them with a special directive: `"use strict"`.
Bu vəziyyət 2009-cu ildə ECMAScript 5 (ES5) standartı təqdim edilənə qədər davam etdi. ES5 dilə yeni xüsusiyyətlər əlavə etdi və mövcud olan bəzi xüsusiyyətləri dəyişdirdi. Köhnə kodların işləməyə davam etməsi üçün bir çox dəyişikliklər susqunluq halında (by default) deaktiv edilmişdi. Bu dəyişiklikləri aktiv etmək üçün xüsusi bir direktivdən istifadə etməlisiniz: `"use strict"`.

## "use strict"

The directive looks like a string: `"use strict"` or `'use strict'`. When it is located at the top of a script, the whole script works the "modern" way.
Bu direktiv bir string kimi görünür: `"use strict"` və ya `'use strict'`. Əgər bu direktiv bir skriptin ən üst hissəsində yerləşdirilərsə, həmin skript "müasir" qaydada işləyir.

For example:
Məsələn:

```js
"use strict";

// this code works the modern way
// bu kod müasir qaydada işləyir
...
```

We will learn functions (a way to group commands) soon. Looking ahead, let's note that `"use strict"` can be put at the beginning of the function body instead of the whole script. Doing that enables strict mode in that function only. But usually, people use it for the whole script.
Biz funksiyaları (ifadələri qruplaşdırmaq üçün bir yoldur) tezliklə öyrənəcəyik. İndilik isə qeyd etməliyik ki, `"use strict"` direktivini skriptin ən üstündə yerləşdirmək əvəzinə, bir funksiyanın başlanğıcına da əlavə etmək mümkündür. Bu halda yalnız həmin funksiya müasir qaydada işləyəcək. Lakin, adətən insanlar bu direktivi bütün skript üçün istifadə edirlər.

````warn header="\"use strict\" direktivinin ən üstdə olduğundan əmin olun"
Əmin olun ki, `"use strict"` direktivi skriptinizin ən üst hissəsində yerləşir, əks halda sıx rejim aktivləşməyəcək.

````warn header="Ensure that \"use strict\" is at the top"
Please make sure that `"use strict"` is at the top of your scripts, otherwise strict mode may not be enabled.

Strict mode isn't enabled here:
Burada sıx rejim aktiv deyil:

```js no-strict
alert("some code");
// "use strict" below is ignored--it must be at the top
alert("bəzi kodlar");
// "use strict" aşağıda yerləşdiyindən nəzərə alınmayacaq -- o mütləq ən yuxarıda olmalıdır

"use strict";

// strict mode is not activated
// sıx rejim aktiv deyil
```

Only comments may appear above `"use strict"`.
Sadəcə şərhlər `"use strict"` direktivindən əvvəl yerləşdirilə bilər.
````

```warn header="There's no way to cancel `use strict`"
There is no directive like `"no use strict"` that reverts the engine to old behavior.
```warn header="`use strict`'i ləğv etmək mümkün deyil"
Sıx rejimi deaktiv etmək üçün `"no use strict"` kimi bir direktiv mövcud deyil.

Once we enter strict mode, there's no going back.
Bir dəfə sıx rejim aktivləşdikdən sonra, geri dönüş mümkün deyil.
```

## Browser console
## Brauzer Konsolu

For the future, when you use a browser console to test features, please note that it doesn't `use strict` by default.
Gələcəkdə brauzerin konsolundan xüsusiyyətləri test etmək üçün istifadə etdikdə unutmayın ki, konsol susqunluq halında `use strict` seçənəyini aktivləşdirmir.

Sometimes, when `use strict` makes a difference, you'll get incorrect results.
Bəzən, `use strict` ilə fərqlər yaranır və nəticədə yanlış nəticələr əldə edə bilərsiniz.

You can try to press `key:Shift+Enter` to input multiple lines, and put `use strict` on top, like this:
`key:Shift+Enter` kombinasiyasından istifadə edərək çoxsətirli kod daxil edib `use strict` direktivini ən üstünə yerləşdirin. Məsələn:

```js
'use strict'; <Shift+Enter for a newline>
// ...your code
<Enter to run>
'use strict'; <Shift+Enter ilə yeni sətir əlavə edin>
// ...sizin kod
<İcra etmək üçün Enter>
```

It works in most browsers, namely Firefox and Chrome.
Bu metod əksər brauzerlərdə, məsələn, Firefox Chrome'da işləyir.

If it doesn't, the most reliable way to ensure `use strict` would be to input the code into console like this:
Əgər bu işləməzsə, `use strict` ifadəsini istifadə etmənin ən etibarlı yolu aşağıdakı nümunədə göstərildiyi kimi istifadə etməkdir:

```js
(function() {
'use strict';

// ...your code...
// ...sizin kod...
})()
```

## Always "use strict"
## Hər Zaman "use strict"

We have yet to cover the differences between strict mode and the "default" mode.
Biz hələ sıx rejim ilə "default" rejim arasındakı fərqləri tam əhatə etməmişik.

In the next chapters, as we learn language features, we'll note the differences between the strict and default modes. Luckily, there aren't many and they actually make our lives better.
Növbəti fəsillərdə dil xüsusiyyətlərini öyrəndikcə, sıx rejim və defolt rejim arasındakı fərqləri vurğulayacağıq. Xoşbəxtlikdən, bu fərqlər azdır və həyatımızı daha da asanlaşdırır.

For now, it's enough to know about it in general:
İndilik, aşağıdakıları bilmək kifayətdir:

1. The `"use strict"` directive switches the engine to the "modern" mode, changing the behavior of some built-in features. We'll see the details later in the tutorial.
2. Strict mode is enabled by placing `"use strict"` at the top of a script or function. Several language features, like "classes" and "modules", enable strict mode automatically.
3. Strict mode is supported by all modern browsers.
4. We recommended always starting scripts with `"use strict"`. All examples in this tutorial assume strict mode unless (very rarely) specified otherwise.
1. `"use strict"` direktivi mühərriki sıx rejimə keçirir və bəzi daxili xüsusiyyətlərin davranışını dəyişir. Bunun detallarını daha sonra dərslikdə öyrənəcəyik.
2. `"use strict"` direktivini skriptin və ya funksiyanın ən üstünə yerləşdirərək sıx rejimi aktivləşdirə bilərsiniz. "Siniflər" ("classes") və "modullar" ("modules") kimi bəzi dil xüsusiyyətləri sıx rejimi avtomatik aktivləşdirir.
3. Sıx rejim bütün müasir brauzerlər tərəfindən dəstəklənir.
4. Tövsiyə olunur ki, bütün skriptlərinizə `"use strict"` ilə başlayasınız. Bu dərslikdəki nümunələrin hamısı, başqa cür göstərilmədiyi təqdirdə (çox nadir hallarda), sıx rejimi nəzərdə tutur.