הרבה תכונות חדשות ונוצצות יצאו עם ES2015 (ES6). ועכשיו, מאז שנת 2020, ההנחה היא שמפתחי JavaScript רבים הכירו והחלו להשתמש בתכונות אלה.
בעוד שהנחה זו עשויה להיות נכונה חלקית, עדיין ייתכן שחלק מהתכונות הללו נותרו בגדר תעלומה עבור חלק מההתפתחויות.
אחד המאפיינים שצורף ES6 הוא התוספת של let
ו const
, אשר ניתן להשתמש בהם עבור הצהרת משתנה. השאלה היא, מה מבדיל אותם משנים טובים var
שבהם השתמשנו? אם אתה עדיין לא ברור לגבי זה, מאמר זה הוא בשבילך.
במאמר זה, נדבר var
, let
ואת const
ביחס להיקף, השימוש, והרמה שלהם. כשאתה קורא, שים לב להבדלים ביניהם שעליהם אציין.
Var
לפני הופעתה של ES6, var
הצהרות שלטו. ישנן בעיות הקשורות למשתנים שהוכרזו באמצעות var
. לכן היה צורך בדרכים חדשות להכריז על משתנים שיופיעו. ראשית, בואו נבין var
יותר לפני שנדון בסוגיות אלה.
היקף ור
היקף פירושו בעצם היכן משתנים אלה זמינים לשימוש. var
הצהרות מוגבלות באופן גלובלי או פונקציות / מקומיות.
ההיקף הוא גלובלי כאשר var
משתנה מוכרז מחוץ לפונקציה. המשמעות היא שכל משתנה המוצהר var
מחוץ לחסימת פונקציות זמין לשימוש בכל החלון.
var
הוא מוגדר פונקציה כאשר הוא מוכרז בתוך פונקציה. פירוש הדבר שהוא זמין וניתן לגשת אליו רק בתוך פונקציה זו.
כדי להבין יותר, עיין בדוגמה למטה.
var greeter = "hey hi"; function newFunction() { var hello = "hello"; }
כאן, greeter
הוא היקף גלובלי מכיוון שהוא קיים מחוץ לפונקציה בעוד hello
שהוא מוגדר פונקציה. אז אנחנו לא יכולים לגשת למשתנה hello
מחוץ לפונקציה. אז אם נעשה זאת:
var tester = "hey hi"; function newFunction() { var hello = "hello"; } console.log(hello); // error: hello is not defined
נקבל שגיאה כתוצאה מכך hello
שאיננו זמינים מחוץ לפונקציה.
ניתן להכריז מחדש ולעדכן משתני var
פירוש הדבר שנוכל לעשות זאת באותו היקף ולא נקבל שגיאה.
var greeter = "hey hi"; var greeter = "say Hello instead";
וגם זה
var greeter = "hey hi"; greeter = "say Hello instead";
הרמת ור
הרמה היא מנגנון JavaScript שבו משתנים והצהרות פונקציות מועברים לראש היקפם לפני ביצוע הקוד. פירוש הדבר שאם נעשה זאת:
console.log (greeter); var greeter = "say hello"
זה מתפרש כך:
var greeter; console.log(greeter); // greeter is undefined greeter = "say hello"
כך var
שמשתנים מונפים לראש ההיקף שלהם ומותחלים בערך של undefined
.
בעיה עם var
יש חולשה הנובעת מכך var
. אשתמש בדוגמה הבאה כדי להסביר:
var greeter = "hey hi"; var times = 4; if (times > 3) { var greeter = "say Hello instead"; } console.log(greeter) // "say Hello instead"
לכן, מכיוון times > 3
שהמחזיר נכון, greeter
הוא מוגדר מחדש ל "say Hello instead"
. אמנם זו לא בעיה אם ברצונך greeter
להיות מוגדר מחדש ביודעין , היא הופכת לבעיה כשאתה לא מבין שמשתנה greeter
כבר הוגדר קודם לכן.
אם השתמשת greeter
בחלקים אחרים של הקוד שלך, אתה עלול להיות מופתע מהפלט שאתה עשוי לקבל. סביר להניח שהדבר יגרום להרבה באגים בקוד שלך. זו הסיבה let
ואת const
נחוצים.
לתת
let
עדיף כעת להצהרה משתנה. אין זה מפתיע שכן מדובר בשיפור var
בהצהרות. זה גם פותר את הבעיה var
שזה עתה כיסינו. בואו ניקח בחשבון מדוע זה כך.
let is block scoped
חסימה היא נתח קוד שתוחם על ידי {}. בלוק חי בפלטה מתולתלת. כל דבר בסוגריים מתולתלים הוא חסם.
אז משתנה שהוכרז בבלוק עם let
זמין רק לשימוש בתוך אותו בלוק. תן לי להסביר זאת בדוגמה:
let greeting = "say Hi"; let times = 4; if (times > 3) { let hello = "say Hello instead"; console.log(hello);// "say Hello instead" } console.log(hello) // hello is not defined
אנו רואים כי שימוש hello
מחוץ לבלוק שלה (הפלטה המתולתלת שבה הוגדר) מחזיר שגיאה. הסיבה לכך היא כי let
המשתנים הם רחבי היקף.
אפשר לעדכן אך לא להכריז מחדש.
בדיוק כמו var
, let
ניתן לעדכן משתנה שהוכרז באמצעותו. בניגוד var
, A let
משתנה לא ניתן מחדש הכריז בתוך היקפו. אז אמנם זה יעבוד:
let greeting = "say Hi"; greeting = "say Hello instead";
זה יחזיר שגיאה:
let greeting = "say Hi"; let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared
עם זאת, אם אותו משתנה מוגדר בהיקפים שונים, לא תהיה שום שגיאה:
let greeting = "say Hi"; if (true) { let greeting = "say Hello instead"; console.log(greeting); // "say Hello instead" } console.log(greeting); // "say Hi"
מדוע אין שום שגיאה? הסיבה לכך היא ששני המקרים מתייחסים כמשתנים שונים מכיוון שיש להם היקפים שונים.
עובדה זו עושה let
בחירה טובה יותר מאשר var
. בעת השימוש let
, אינך צריך לטרוח אם השתמשת בעבר במשתנה שכן משתנה קיים רק בתחום שלו.
כמו כן, מכיוון שלא ניתן להכריז על משתנה יותר מפעם אחת במסגרת, אז הבעיה שנדונה קודם לכן המתרחשת עם var
אינה מתרחשת.
הרמת תן
בדיוק כמו var
, let
הצהרות מונפות למעלה. שלא כמו var
אשר מאותחל כ- undefined
, let
מילת המפתח אינה מאותחל. אז אם תנסה להשתמש let
במשתנה לפני ההצהרה, תקבל Reference Error
.
קונסט
משתנים המוצהרים עם const
הערכים הקבועים. const
הצהרות חולקות כמה קווי דמיון עם let
הצהרות.
const declarations are block scoped
Like let
declarations, const
declarations can only be accessed within the block they were declared.
const cannot be updated or re-declared
This means that the value of a variable declared with const
remains the same within its scope. It cannot be updated or re-declared. So if we declare a variable with const
, we can neither do this:
const greeting = "say Hi"; greeting = "say Hello instead";// error: Assignment to constant variable.
nor this:
const greeting = "say Hi"; const greeting = "say Hello instead";// error: Identifier 'greeting' has already been declared
Every const
declaration, therefore, must be initialized at the time of declaration.
This behavior is somehow different when it comes to objects declared with const
. While a const
object cannot be updated, the properties of this objects can be updated. Therefore, if we declare a const
object as this:
const greeting = { message: "say Hi", times: 4 }
while we cannot do this:
const greeting = { words: "Hello", number: "five" } // error: Assignment to constant variable.
we can do this:
greeting.message = "say Hello instead";
This will update the value of greeting.message
without returning errors.
Hoisting of const
Just like let
, const
declarations are hoisted to the top but are not initialized.
So just in case you missed the differences, here they are:
var
declarations are globally scoped or function scoped whilelet
andconst
are block scoped.var
variables can be updated and re-declared within its scope;let
variables can be updated but not re-declared;const
variables can neither be updated nor re-declared.- They are all hoisted to the top of their scope. But while
var
variables are initialized withundefined
,let
andconst
variables are not initialized. - While
var
andlet
can be declared without being initialized,const
must be initialized during declaration.
Got any question or additions? Please let me know.
Thank you for reading :)