JAVASCRIPT בסיס בעיברית
אנא
הסתכלו על השגיאה הזו פה למטה, ואני מאוד מבקש מכל מי שלא יכול לאמר לי בדיוק מה
השגיאה רק מהסתכלות על התמונה הזו שיקרא בעיון את המייל הזה והדוגמא שלו.
אז
אם אתה אחד מאותם חברים יקרים שרוצה ללמוד, אנא פתח במקביל את הJSBIN הזה שהכנתי
במיוחד, ובצד ימין אפשר ללחוץ על הכפתורים clear ואח"כ run כדי להריץ מחדש, וכן כולם מוזמנים לערוך, זה
לא יצור גרסה חדשה לכולם אלא מקומית לכל אחד
רקע
בסיסי – JS
זה שפה שבין היתר מבוססת SCOPE, כלומר כל אובייקט ופונקציה זה SCOPE
משל עצמו, שמהווה CHILD לSCOPE שמעליו, כאשר הגלובלי, הROOT SCOPE, הוא הWINDOW.
חלק
מהמנגון הזה אומר ש child scope כאשר הוא מחפש איזה פרמטר/פונקציה אם הוא לא
מוצא את זה אצלו הוא יחפש אותו אצל אבא שלו, סבא שלו, סבא רבא וכו'.
אז
אם נלך לדוגמא שלנו אנו רואים פרמטר בשם globalVar שמוגדר בROOT, מה שנקרא גלובלי, ולאורך כל הדרך, בכל מקום
בעולם שנחפש אותו אנו תמיד נמצא אותו.
לאחר
מכן יש לנו פונקציה (וכל פונקיצה היא אובייקט וכל אובייקט הוא פונקציה בJS),
בשם SCOPE1, ויש לו 2 פרמטרים, scope1Var, scope4Var.
עכשיו
הבדיקה הראשונה שלנו שקראת בCONSOLE בשם scope1 top, שם אנו בודקים את 2 הפרמטרים הללו, ואנו
רואים ש scope1Var מחזיר תוצאה ואילו scope4Var הוא undefined, אך מחזיר תוצאה, למרות שהיא undefined.
מדוע
זה?
כי
JS קודם כל בעת הקמת הSCOPE הוא "מצהיר" על הפרמטרים כולם שיש
בSCOPE אלא שערכים הוא מציב לאורך הדרך. לכן כל עוד לא הגענו להגדרה של scope4Var לא נקבל ערך שלו אך גם לא שגיאה שהוא לא קיים, אלא פשוט שערכו הוא
UNDEFINED.
למה
אני אומר מצהיר במרכאות? כי באמת מחמת שפונ' היא אובייקט למעשה אני פונה לאובייקט SCOPE1
וכו' .
נמשיך
הלאה ל scope2 שם אנו ממשיכים להצהיר על scope2Var, ואנו בודקים את כל הפרמטרים שדיברנו עליהם
עד כה, הגלובלי ו1,2,4.
כפי
שאנו רואים כולם מחזירים תוצאות, אלא ש4 מחזיר שוב undefined. כלומר scope2 עולה ומחפש את 4 בscope1 ומוצא אותו, אלא שהוא עדיין חסר ערך.
אם
נמשיך הלאה נראה שאני קורא לSCOPE2 לאחר שהכנסתי ערך ל scope4Var גם רואים ממנו תוצאה.
נשמיך
הלאה ל scope3, שם אנו רואים שקריאה לפרמטר הגלובלי עובדת אבל מיד לאחר מכן אנו
מקבלים שגיאה ReferenceError: scope1Var is not defined
כי
scope1Var קיים בscope1 שהוא "אח" של scope3 אך
לא "בן" שלו, ולכן הוא אפילו לא מוצא "הצהרה" שלו.
נמצאנו
למדים שעצם ההצהרה של פרמטר איפהשהו בSCOPE הנוכחי או אחד ההורים שלו כבר מביא מצב
שהפרמטר מוכר כקיים אלא שהוא חסר ערך לחלוטין, לא NULL, אלא undefined, ואילו יותר חמור מזה הוא שנהוא אינו מוגדר
כלל ואז זה השגיאה לעיל.
NULL בJS צריך סיפור משל עצמו.
אז
נשנן
פרמטר
שלא הוצהר מעולם בSTACK של הSCOPES שלי - is
not defined
פרמטר
שכן הוצהר בSTACK של הSCOPES שלי – undefined
פרמטר
שכן הוצהר בSTACK של הSCOPES שלי וקיבל את המילה var – NULL
פרמטר
שכן הוצהר בSTACK של הSCOPES שלי וקיבל ערך – לפי הערך.
כעת
השגיאה לעיל בתמונה צריכה להיות מובנת ממבט ראשון – מנסים לגשת לפרמטר שמוצהר
איפשהו בSTACK של הSCOPES שלי אך יותר מאוחר, כלומר בהמשך, ואילו אני
מנסה לגשת אליו כעת.
נסיון
לגשת ל is not defined תתן ReferenceError, נסיון לגשת ל undefined זה כבר תלוי, אפשר לבדוק מה קורה איתו, אבל
אם מנסים לגשת אליו, כלומר לתוכן שלו מקבלים את השגיאה למעלה.
Comments
Post a Comment