اÙ٠عÙÙ٠ات Ø¯Ø§Ø®Ù ÙØ°Ù اÙÙ ÙØ§ÙØ© ØªØ³Ø§Ø¹Ø¯ÙØ§ ÙÙ ÙÙ٠اÙÙØµÙص اÙÙØ¯ÙÙ Ø© Ø£ÙØ«Ø± ÙÙØ§ ØªØØªÙ٠عÙ٠أ٠٠عÙÙ٠ات ع٠ÙÙÙÙØ© ÙØªØ§Ø¨Ø© ÙÙØ¯ Ø¬Ø¯ÙØ¯
Ø°ÙØ±Ùا ÙÙ Ø£ÙØ§Ø¦Ù اÙÙØµÙÙ ØÙ٠تÙÙÙ ÙØ§ ع٠اÙÙ ØªØºÙØ±Ø§Øª, Ø°ÙØ±Ùا Ø«ÙØ§Ø« طرائ٠ÙÙØªØµØ±ÙØ Ø¹ÙÙØ§:
letconstvar
تصرÙÙ ÙÙØ§ Ø§ÙØ¥ÙادتÙÙ âletâ Ùâconstâ Ø¨Ø°Ø§Øª Ø§ÙØ·Ø±ÙÙØ© (باÙÙ
ÙØ§Ùسة Ù
ع Ø§ÙØ¨Ùئات اÙÙ
ÙØ¹Ø¬Ù
ÙØ©).
بÙÙÙ
ا âvarâ ÙÙÙ ÙØØ´ آخر Ù
ختÙ٠جذرÙÙØ§ ÙÙØ¹Ùد Ù٠أصÙ٠إÙÙ ÙØ±Ù٠سØÙÙØ©. ÙØ§ ÙØ³ØªØ¹Ù
Ù٠عادة٠ÙÙ Ø§ÙØ³Ùربتات Ø§ÙØØ¯ÙØ«Ø© ÙÙÙÙÙÙ Ø³ØªØ¬Ø¯Ù ØØªÙ
ÙØ§ Ø®ÙÙ Ø¥ØØ¯Ù ØµØ®ÙØ± Ø§ÙØ³Ùربتات اÙÙØ¯ÙÙ
Ø©.
ÙÙ Ù٠ترغب Ø¨Ø§ÙØªØ¹Ø±Ù٠عÙÙ ÙØ°Ù Ø§ÙØ³Ùربتات ÙÙÙ ÙÙ٠تخطÙÙ ÙØ°Ø§ اÙÙØµÙ أ٠تأجÙÙÙ ÙÙÙØª ÙØ§ØÙ. ÙÙÙÙ ÙØ§ ØªÙØ³Ù Ø§ØØªÙ اÙÙØ© ÙØ¯Ù Ù ÙØ§ØÙÙØ§ ÙÙØºØ¯Ø± Ø¨Ù ÙØ°Ø§ اÙÙØØ´.
Ù
٠أÙÙ ÙÙÙØ© ÙØ±Ù بأÙ٠تصرÙÙ âvarâ ÙØ´Ø§Ø¨Ù تصرÙÙ âletâØ Ø£Ù Ø£ÙÙÙ ÙÙØµØ±ÙØ (Ù
Ø«Ù Ø§ÙØ«Ø§ÙÙ) ع٠Ù
ØªØºÙØ±:
function sayHi() {
var phrase = "Hello"; // â«Ù
ØªØºÙØ± Ù
ØÙÙØ استعÙ
ÙÙØ§ «var» بد٠«let»
alert(phrase); // Hello
}
=======
The `var` declaration is similar to `let`. Most of the time we can replace `let` by `var` or vice-versa and expect things to work:
```js run
var message = "Hi";
alert(message); // Hi
But internally var is a very different beast, that originates from very old times. Itâs generally not used in modern scripts, but still lurks in the old ones.
alert(phrase); // â«Ø®Ø·Ø£Ø phrase ØºÙØ± ٠عرÙÙ
ÙÙÙÙ... Ù
ا Ø®ÙÙ ÙØ§Ù أعظÙ
. Ø¥ÙÙ٠اÙÙØ±ÙÙ.
=======
If you don't plan on meeting such scripts you may even skip this chapter or postpone it.
On the other hand, it's important to understand differences when migrating old scripts from `var` to `let`, to avoid odd errors.
## "var" has no block scope
Variables, declared with `var`, are either function-scoped or global-scoped. They are visible through blocks.
```js run
if (true) {
var test = true; // â«ÙستعÙ
٠«var» بد٠«let»
}
alert(test); // â«Ø§ÙÙØ§ØªØ¬ trueØ Ø£Ù Ø£Ù٠اÙÙ
ØªØºÙØ± «ØÙÙ ÙÙØ±Ø²Ù» بعد Ø¥ÙØ§Ø¯Ø© if
تجاÙÙ âvarâ ÙØªÙ Ø§ÙØ´ÙÙØ±Ø©Ø ÙØ¨Ùذا صار Ù
ØªØºÙØ± âtestâ Ø¹Ù
ÙÙ
ÙÙØ§.
Ù٠استعÙ
ÙÙØ§ âlet testâ Ø¨Ø¯Ù âvar testâ ÙØ³ÙÙÙ٠اÙÙ
ØªØºÙØ± Ø¸Ø§ÙØ±Ùا ÙØ¨Ø§ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø¯Ø§Ø®Ù Ø¥ÙØ§Ø¯Ø© âifâ ÙÙØ· ÙØ§ ØºÙØ±:
if (true) {
let test = true; // â«ÙستعÙ
٠«let»
}
alert(test); // ReferenceError: test is not defined
ÙØ³Ø±Ù Ø§ÙØ£Ù
ر ذات٠عÙÙ Ø§ÙØÙÙØ§Øª ÙÙØ§ ÙÙ
Ù٠أ٠ÙÙÙÙ `âvarâ` Ù
ØÙÙÙØ§ ØØ³Ø¨ اÙÙØªÙØ© Ø£Ù ØØ³Ø¨ Ø§ÙØÙÙØ©:
```js
for (var i = 0; i < 10; i++) {
var one = 1;
// ...
}
alert(i); // 10, "i" is visible after loop, it's a global variable
alert(one); // 1, "one" is visible after loop, it's a global variable
ÙÙ ÙØªØ¨Øª ÙØªÙØ© Ø´ÙÙØ±Ø© ÙÙ Ø¯Ø§ÙØ© ÙØ³ÙØµÙØ± âvarâ Ù
ØªØºÙØ±Ùا عÙÙ Ù
ستÙÙ Ø§ÙØ¯Ø§ÙØ© ÙØ§Ù
ÙØ©Ù.
function sayHi() {
if (true) {
var phrase = 'Hello';
}
alert(phrase); // ÙÙ
ÙÙÙØ§ ÙØ¹Ù ÙØ°Ø§
}
sayHi();
alert(phrase); // ReferenceError: phrase is not defined
As we can see, var pierces through if, for or other code blocks. Thatâs because a long time ago in JavaScript, blocks had no Lexical Environments, and var is a remnant of that.
ØªÙØ¹Ø§Ùج Ø§ÙØªØµØ±ÙØØ§Øª باستعÙ
ا٠âvarâ Ø¹Ùد بدء Ø§ÙØ¯Ø§ÙØ©
ÙØ¹Ø§Ùج Ø§ÙØªØµØ±ÙØØ§Øª باستعÙ
ا٠âvarâ Ù
ت٠Ù
ا بدأت Ø§ÙØ¯Ø§ÙØ© (أ٠بدأ Ø§ÙØ³ÙØ±Ø¨ØªØ ÙÙÙ
ØªØºÙØ±Ø§Øª Ø§ÙØ¹Ù
ÙÙ
ÙØ©).
âvarâ tolerates redeclarations
If we declare the same variable with let twice in the same scope, thatâs an error:
let user;
let user; // SyntaxError: 'user' has already been declared
With var, we can redeclare a variable any number of times. If we use var with an already-declared variable, itâs just ignored:
var user = 'Pete';
var user = 'John'; // this "var" does nothing (already declared)
// ...it doesn't trigger an error
alert(user); // John
âvarâ variables can be declared below their use
أ٠أÙÙ Ù
ØªØºÙØ±Ø§Øª âvarâ ØªÙعرÙÙ Ù
Ù Ø¨Ø¯Ø§ÙØ© Ø§ÙØ¯Ø§ÙØ© Ù
ÙÙ
ا ÙØ§Ù Ù
ÙØ§Ù تعرÙÙÙØ§ (ÙØ°Ø§ ÙÙ ÙÙ
ÙÙÙ Ø§ÙØªØ¹Ø±ÙÙ ÙÙ Ø¯Ø§ÙØ© Ù
ØªØ¯Ø§Ø®ÙØ© أخرÙ).
ÙØ¹Ù٠ذÙ٠أÙÙ ÙØ°Ù Ø§ÙØ´ÙÙØ±Ø©:
function sayHi() {
phrase = 'Hello';
alert(phrase);
var phrase;
}
sayHi();
Ù
ØªØ·Ø§Ø¨ÙØ© تÙÙÙÙØ§ Ù
ع ÙØ°Ù (Ø¨ØªØØ±ÙÙ âvar phraseâ Ø¥Ù٠أعÙÙ):
function sayHi() {
var phrase;
phrase = 'Hello';
alert(phrase);
}
sayHi();
Ø£Ù ØØªÙ ÙØ°Ù (ÙØ§ ØªÙØ³Ù بأÙÙ ÙÙØªÙ Ø§ÙØ´ÙÙØ±Ø§Øª Ù ÙÙÙ ÙØ©):
function sayHi() {
phrase = 'Hello'; // (*)
if (false) {
var phrase;
}
alert(phrase);
}
sayHi();
ÙØ¯Ø¹Ù اÙÙØ§Ø³ ÙØ°Ø§ Ø§ÙØ³ÙÙ٠بسÙÙÙ Â«Ø§ÙØ·ÙÙ» hoisting (Ø£Ù Ø§ÙØ±Ùع) إذ Ø£ÙÙ Ù
ØªØºÙØ±Ø§Øª âvarâ «تطÙÙ» Ø¥Ù٠أعÙÙ Ø§ÙØ¯Ø§ÙØ© (Ø£Ù ØªØ±ØªÙØ¹ Ø¥ÙÙ Ø£Ø¹ÙØ§Ùا).
أ٠أÙÙÙ Ù٠اÙÙ
Ø«Ø§Ù Ø£Ø¹ÙØ§ÙØ Ø§ÙÙØ±Ø¹ âif (false)â Ù
Ù Ø§ÙØ¥Ùادة ÙØ§ ÙØ¹Ù
Ù ÙØ· ÙÙÙÙ ÙØ°Ø§ ÙÙØ³ بÙ
ÙÙ
Ø Ø¥Ø° Ø£ÙÙ âvarâ Ø¯Ø§Ø®Ù٠سÙÙØ¹Ø§Ùج ÙÙ Ø¨Ø¯Ø§ÙØ© Ø§ÙØ¯Ø§ÙØ©Ø ÙØÙ٠تص٠عÙ
ÙÙØ© Ø§ÙØªÙÙÙØ° Ø¥ÙÙ â(*)â Ø³ÙÙÙ٠اÙÙ
ØªØºÙØ± Ù
ÙØ¬ÙØ¯ÙØ§ ÙØ§ Ù
ØØ§ÙØ©.
Ø§ÙØªØµØ±ÙØØ§Øª تطÙ٠صØÙØØ ÙÙÙÙÙ ÙÙØ³ عبارات Ø§ÙØ¥Ø³Ùاد.
Ø§ÙØ£Ùض٠ÙÙ ÙÙ Ø«Ù٠ذÙÙ ÙÙ ÙØ°Ø§ اÙ٠ثاÙ:
function sayHi() {
alert(phrase);
var phrase = 'Hello';
}
sayHi();
ÙÙ Ø§ÙØ³Ø·Ø± âvar phrase = "Hello"â Ø¥Ø¬Ø±Ø§Ø¡Ø§Ù Ø§Ø«ÙØ§Ù:
- Ø§ÙØªØµØ±ÙØ Ø¹Ù Ø§ÙÙ
ØªØºÙØ± باستعÙ
اÙ
var - Ø¥Ø³ÙØ§Ø¯ ÙÙÙ
Ø© ÙÙÙ
ØªØºÙØ± باستعÙ
اÙ
â=â.
ÙØªØ¹Ø§Ù ٠اÙÙ ØØ±Ù٠٠ع Ø§ÙØªØµØ±ÙØØ§Øª ٠ت٠بدء تÙÙÙØ° Ø§ÙØ¯Ø§ÙØ© (إذ Ø§ÙØªØµØ±ÙØØ§Øª تطÙÙ)Ø ÙÙÙÙ٠عبارة Ø§ÙØ¥Ø³Ùاد ÙØ§ تع٠٠إÙÙØ§ ØÙث٠ا Ø¸ÙØ±ØªØ ÙÙØ·. Ø¥Ø°ÙØ§ ÙØ§ÙØ´ÙÙØ±Ø© ØªØ¹Ù Ù Ø¨ÙØ°Ø§ اÙÙØÙ ÙØ¹ÙÙÙØ§:
function sayHi() {
var phrase; // â«Ø¨Ø§Ø¯Ø¦ Ø°Ù Ø¨Ø¯Ø¡Ø ÙØ¹Ù
Ù Ø§ÙØªØµØ±ÙØ...
alert(phrase); // ØºÙØ± Ù
عرÙÙ
phrase = 'Hello'; // â«...ÙÙØ§.
}
sayHi();
ÙÙØ¹Ø§Ùج اÙÙ
ØØ±ÙÙ Ø§ÙØªØµØ±ÙØØ§Øª âvarâ ØÙ٠تبدأ Ø§ÙØ¯ÙØ§ÙØ ÙØ¨Ùذا ÙÙ
ÙÙÙØ§ Ø§ÙØ¥Ø´Ø§Ø±Ø© Ø¥ÙÙÙØ§ Ø£ÙÙÙ
ا Ø£Ø±Ø¯ÙØ§ ÙÙ Ø§ÙØ´ÙÙØ±Ø©. ÙÙÙÙ Ø§ÙØªØ¨Ù ÙØ§ÙÙ
ØªØºÙØ±Ø§Øª ØºÙØ± Ù
عرÙÙØ© ØØªÙ ØªÙØ³Ùد Ø¥ÙÙÙØ§ ÙÙÙ
.
ÙÙ Ø§ÙØ£Ù
Ø«ÙØ© Ø£Ø¹ÙØ§Ù عÙ
Ù Ø§ÙØªØ§Ø¨Ùع âalertâ Ø¯Ù٠أÙ٠أخطاء إذ أ٠اÙÙ
ØªØºÙØ± âphraseâ Ù
ÙØ¬Ùد. ÙÙÙÙ ÙÙ
ØªÙØ³Ùد ÙÙÙ ÙÙÙ
Ø© بعد ÙØ¹Ø±Ø¶ âundefinedâ.
In both examples above, alert runs without an error, because the variable phrase exists. But its value is not yet assigned, so it shows undefined.
IIFE
In the past, as there was only var, and it has no block-level visibility, programmers invented a way to emulate it. What they did was called âimmediately-invoked function expressionsâ (abbreviated as IIFE).
âImmediately-Invoked function Expressionsâ
ÙØ°Ø§ ÙØ§ ÙØ³ØªØ®Ø¯Ù ØØ§ÙÙØ§Ù, ÙÙÙ ØªØ³ØªØ·ÙØ¹ Ø¥ÙØ¬Ø§Ø¯ÙÙ Ù٠اÙÙØµÙص اÙÙØ¯ÙÙ Ø©.
طرÙÙØ© ÙØªØ§Ø¨Ø© (IIFE):
(function () {
var message = 'Hello';
alert(message); // Hello
})();
ÙØ°Ø§ ÙØ¹ØªØ¨Ø± تعرÙÙ Ø¯Ø§ÙØ© صÙÙØ¹Øª ÙØªÙ ت Ù ÙØ§Ø¯Ø§ØªÙا عÙ٠اÙÙÙØ±. ÙØ°ÙÙ ÙØªÙ تÙÙÙØ° اÙÙÙØ¯ ÙÙÙØ§ Ù ØªØºÙØ±Ø§ØªÙا Ø§ÙØ®Ø§ØµØ©.
Here, a Function Expression is created and immediately called. So the code executes right away and has its own private variables.
The Function Expression is wrapped with parenthesis (function {...}), because when JavaScript engine encounters "function" in the main code, it understands it as the start of a Function Declaration. But a Function Declaration must have a name, so this kind of code will give an error:
// Tries to declare and immediately call a function
function() { // <-- SyntaxError: Function statements require a function name
var message = "Hello";
alert(message); // Hello
}();
ØØªÙ ÙÙ ÙØ¶Ø¹Ùا إس٠, ÙÙ ÙØ¹Ù Ù ÙØ°Ø§, ÙØ£Ù Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ÙØ§ ØªØ³Ù Ø Ø¨ØªØ¹Ø±ÙÙ Ø¯Ø§ÙØ© Ø³ØªØªÙ Ù ÙØ§Ø¯Ø§ØªÙا ÙÙØ±ÙاÙ:
// ÙØ°Ø§ خطأ بسبب Ø§ÙØ£ÙÙØ§Ø³ اÙÙ
ÙØ¬Ùدة Ø¨Ø§ÙØ£Ø³ÙÙ
function go() {
}();
ÙØ°ÙÙ, Ø§ÙØ£ÙÙØ§Ø³ ØÙÙ Ø§ÙØ¯Ø§ÙØ© تعتبر خدعة ÙØ¬Ø¹Ù Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ÙÙ٠أÙÙØ§ ÙØµÙع Ø³ÙØ§Ù أخر ÙÙØªØ¹Ø±ÙÙ, ÙØ°Ù٠إ٠تعرÙÙ Ø§ÙØ¯Ø§ÙØ©: ÙØ§ ÙØØªØ§Ø¬ Ø¥ÙÙ Ø§Ø³Ù ÙØ°ÙÙ ØªØªÙ Ù ÙØ§Ø¯Ø§ØªÙا عÙ٠اÙÙÙØ±
ÙÙØ§Ù Ø£ÙØ¶Ø§Ù طر٠أخرÙ:
// Ways to create IIFE
(function() {
alert("Parentheses around the function");
})();
(function() {
alert("Parentheses around the whole thing");
}());
!function() {
alert("Bitwise NOT operator starts the expression");
}();
+function() {
alert("Unary plus starts the expression");
}();
Ù ÙØ®Øµ
ÙÙØ§Ù ÙØ±ÙÙ٠جÙÙØ±Ù٠بÙÙ âvarâ Ù
ÙØ§Ø²Ùة٠بÙÙ âlet/constâ:
-
ÙÙØ³ ÙÙ ØªØºÙØ±Ø§Øª
âvarâÙØ·Ø§ÙÙØ§ ÙØªÙÙÙØ§ ÙØ£ØµØºØ± ÙØ·Ø§Ù ÙÙØ§ ÙÙ ÙÙ Ø§ÙØ¯ÙاÙ. -
ØªÙØ¹Ø§Ùج Ø§ÙØªØµØ±ÙØØ§Øª باستع٠اÙ
âvarâØ¹ÙØ¯ بدء Ø§ÙØ¯Ø§ÙØ© (أ٠بدء Ø§ÙØ³ÙØ±Ø¨ØªØ ÙÙÙ ØªØºÙØ±Ø§Øª Ø§ÙØ¹Ù ÙÙ ÙØ©). -
varvariables have no block scope, their visibility is scoped to current function, or global, if declared outside function. -
vardeclarations are processed at function start (script start for globals).
Ø¨ÙØ°Ø§Ø ØºØ§ÙØ¨Ùا Ù
ا ÙÙÙ٠استعÙ
ا٠âvarâ Ø£Ø³ÙØ£ Ø¨ÙØ«Ùر Ù
Ù âletâ Ø¨Ø¹Ø¯Ù
ا Ø¹Ø±ÙØª اÙÙØ±Ù٠بÙÙÙØ§Ø ÙØ§ÙÙ
ØªØºÙØ±Ø§Øª عÙÙ Ù
ستÙ٠اÙÙÙØªÙ Ø£Ù
ر رائع Ø¬Ø¯ÙØ§ ÙÙÙØ°Ø§ Ø§ÙØ³Ø¨Ø¨ تÙ
اÙ
ÙØ§ Ø£ÙØ¶ÙÙØª âletâ Ø¥ÙÙ Ù
Ø¹ÙØ§Ø± اÙÙØºØ© Ù
ÙØ° زÙ
Ù ÙØµØ§Ø±Øª Ø§ÙØ¢Ù Ø§ÙØ·Ø±ÙÙØ© Ø§ÙØ£Ø³Ø§Ø³ÙØ© (ÙÙ Ùâconstâ) ÙÙØªØµØ±ÙØ Ø¹Ù Ù
ØªØºÙØ±.
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)