הבדל בין let ל var

אנא חדד את ההבדל בין let ל var ומתי צריך להשתמש בכל אחד

לייק 1

כמעט תמיד ב const. פרט למקרים שבהם באמת המשתנה מקבל ערכים שונים לאורך ריצת הפונקציה ואז ב let. אף פעם לא ב var.

באמת.

var הוחלף ב let וב const כי היו המון בעיות איתו. יש הרבה מקרים שמשתנה שהוגדר ב var לא מתנהג כמו שהיית חושבת שמשתנה יתנהג וזה הוביל לבאגים משונים.

שתי דוגמאות קלות זה הגדרת var מחוץ לפונקציה והגדרת var בתוך לולאה. בראשונה נניח שיש לך שני קבצים. באחד את כותבת:

var x = 10;

ובשני:

console.log(window.x);

אז אם השני נטען אחרי הראשון יודפס הערך 10. כלומר הגדרת משתנה גלובלי אולי בלי להתכוון. עם const ו let זה לא היה קורה.

השניה בלולאה:

for (var i=0; i < 10; i++) {
 // do something
}

console.log(i);

הפקודה האחרונה מצליחה ומדפיסה את המספר 10, שהוא הערך האחרון ש i קיבל. בשפות אחרות (למשל Java) משתנה שהוגדר בלולאה לא מוכר אחריה והרבה מתכנתים שהגיעו ל JS מצאו את זה מבלבל.

אפשר לקרוא על עוד כמה מקרים כאן:

לייק 1

ההתנהגות הזאת קורית גם בפייתון.
גם שם זה נחשב בעייתי? אני חשבתי שזו פשוט התנהגות שצריך להתרגל אליה

כמעט.

בפייתון משתנה גלובלי בקובץ נשאר בתחום הקובץ,
כלומר בתוכנית של מספר קבצים המשתנה ה״גלובלי״ עדיין תחום לקובץ שבו הוא הוגדר.
(שלא כמו var של JavaScript שמגדיר את המשתנה לכל הקבצים בתוכנית)

פייתון גם מספיק חכם כדי לזהות שהקוד הזה לא הגיוני:

print(x)
x = 10

אבל JavaScript דוקא יזרום עם זה ופשוט ידפיס את המילה undefined:

console.log(x);
var x = 10;

אבל הלהיט האמיתי קורה כשאת מוחקת את שורת הגדרת המשתנה (ב JS) וזה גורם ל console.log להפסיק לעבוד, כמו שקרה בפייתון.

אני חושב שלכל שפה יש את המוזרויות שלה,
וגם הגדרת המשתנים בפייתון לא מושלמת,
אבל כשיש לנו בחירה כן כדאי לבחור בדרך הכי פחות מבלבלת
כי בסוף מישהו יצטרך לתחזק את הקוד הזה :slight_smile: