ביאור הקוד if window !== top ב JS
-
אוקי אני לא ממש בדקתי את הקומפיילר.
תראה אתה משתמש במונח הצהרה משתמעת שזה לא מונח נכון.
אתה כנראה מכיר את זה מ VB ואתה לא מבין למה זה לא עובד ב JS אותו דבר.
ואני מסביר לך שאין כזה דבר הצהרה משתמעת ב JS.שמתכנת כותב בתוך פונקציה
a=1
בלי להצהיר עליו בתוך הפונקציה. בגלל שאין כזה דבר הצהרה משתמעת אז הוא מתכוון להכניס 1 למשתנה a שמוגדר בחוץ.
ובאמת יכול להיות מוגדר בחוץ משתנה כזה. כמו שהדגמתי קודם.
כלומר בכל מקרה כהיום a=1 מתכוון למשתנה חיצוני.
אתה רוצה שלעיתים זה יהיה חיצוני ולעיתם פנימי. וזה התנהגות לא עיקבית ולא נורמלית לדעתי.פורסם במקור בפורום CODE613 ב25/08/2017 12:56 (+03:00)
-
אתה רוצה שלעיתים זה יהיה חיצוני ולעיתם פנימי. וזה התנהגות לא עיקבית ולא נורמלית לדעתי.
למה לא עקבי? אמרתי שכאשר המשתנה מופיע בפעם הראשונה בסקופ פנימי הוא יהיה פנימי ואם בחיצוני יהיה חיצוני. זו הגדרה ברורה והגיוניות, אתה קורא לזה לא עקבי ולא נורמלי?
פורסם במקור בפורום CODE613 ב26/08/2017 20:36 (+03:00)
-
בא נעשה סימולציה.
נניח המתנכתים ב JS משתמשים בטכניקת הצהרה משתמעת.function(){ var a = 1; //lot code (function(){ a = 8; //code })() //lot code if(a == 1){ } }
מתכנת כותב קוד כפי שאתה רואה פה קוד ארוך כמו שרוך.
בלי השורה 7 כמובן.
המשתנה a הוא מוגדר בפונציה החיצונית כמובן.ואז מגיע החבר שלו והוא רגיל שהוא מגדיר משתנה פרטי בפונציה בלי var בגלל המושג "הצהרה משתמעת" אז הוא מגדיר את a כ 8.
אבל הוא לא יודע שזה כבר מוגדר בסקופ העליון ובעצם הוא שבר את כל העסק.יכול להיות גם הפוך.
יכול להיות שהמשתנה a מוגדר בפונקציה בתור משהו פרטי ואז הוסיפו אחרי זה את המשתנה a בסקופ החיצוני והמתכנת לא מבין למה ה a משתנה לו ל 8.לכן אין כזה דבר הצהרה משתמעת. אין כזה מושג.
רוצה משתנה פרטי שים var.פורסם במקור בפורום CODE613 ב26/08/2017 22:00 (+03:00)
-
ואז מגיע החבר שלו והוא רגיל שהוא מגדיר משתנה פרטי בפונציה בלי var בגלל המושג "הצהרה משתמעת" אז הוא מגדיר את a כ 8.
אבל הוא לא יודע שזה כבר מוגדר בסקופ העליון ובעצם הוא שבר את כל העסק.לא שבר כלום, כי ה-a המקומי קיבל ערך 8 ולא ה-a הגלובלי שנשאר ללא שינוי.
כלומר כל זמן שהוא בתוך הסקופ הפנימי בין שורה 6-9 הוא לא יכול לגשת ל-a הגלובלי רק אם יכתוב window.a, בגלל שבאותו הסקופ כבר הוצהר על משתנה עם השם a, בסקופ אחר פנימי הוא כן יוכל לגשת למשתנה הגלובלי בלי המילה window.פורסם במקור בפורום CODE613 ב26/08/2017 22:48 (+03:00)
-
אז מה לעשות שזה לא עובד ככה ב JS.
כל הראש שונה.
a=8 בתוך שורה 7 משפיע על המשתנה שהוצהר בשורה 3.תראה JS זה שפה שונה ממה שאתה מכיר
יש לה הגיון כנראה שונה ממה שאתה מכיר אל תצפה שהיא תתנהג כפי ההגיון שהורגלת אליו.
אני אישית אוהב מאוד את השפה. ונהנה לתכנת איתה.דבר אחד מפריע לי שאם יש אובייקט
a={}
אם עושים a.a זה מחזיר undefined אבל לא פולט שגיאה.
אם עושים a.a.a.a זה פולט שגיאה.
אני רוצה שיחזיר undefined בלי לפלוט שגיאה. כי זה לדעתי מתאים לסגנון הגמישות של השפה.
אגב באנגולר a.a.a.a לא מחזיר שגיאה.פורסם במקור בפורום CODE613 ב26/08/2017 23:37 (+03:00)
-
a=8 בתוך שורה 7 משפיע על המשתנה שהוצהר בשורה 3.
הוא מושפע כיון שJS החליט שבלי VAR כל דבר נהפך לגלובלי, ולכן a משוכתב, אבל אם בלי VAR היה הופך למקומי, הוא לא היה מושפע.
הרי אנחנו מדברים בסימוליציה, מה היה קורא אילו משתנה בלי VAR היה כאילו יש לו VAR והיה הופך למקומי ולא לגלובלי.
אז אני אומר שאם הוא מקומי הוא לא משפיע בכלום על המשתנה הגלובלי על אף שהשם שלהם זהה.פורסם במקור בפורום CODE613 ב27/08/2017 00:07 (+03:00)
-
זה לא נהפך לגלובלי זה מתייחס לסקופ האב.
בדוגמה שהבאתי זה מתייחס ל a שנמצא בסקופ האב ששמה זה פרטי בסקופ של האב.
בלי שזה יתייחס לאב. לא יהיה לך דרך להתייחס למשתנים שנמצאים בסקופ של האב. ולא תוכל לתכנת הרבה דברים ב JS.
אם זה יהיה ככה אני ירגיש שהכנסת אותי לבית כלא רציני. אם אתה רוצה אני יכול להביא לך דוגמאות.פורסם במקור בפורום CODE613 ב27/08/2017 00:49 (+03:00)