ביאור הקוד if window !== top ב JS
-
אבל זה לא בגלל שמי שפיתח את השפה היה טיפש...
אני אמרתי שהיה טיפש?!
אמרתי שאני לא מבין מדוע הצהרה משתמעת הופכת למשתנה גלובלי ולא למשתנה באותו סקופ, ועד כעת לא הצלחתי להבין, גם אחרי ההסבר של מאט.
באופן כללי בכל שפות התיכנות משתנה גלובלי זה דבר שעושים אותו לעיתים רחוקות אחרי שיקול דעת מעמיק, וזה בדיוק להיפך מהצהרה משתמעת שנעשית בכתיבת קוד קלילה, והרבה פעמים סתם בגלל טעות הקלדה.פורסם במקור בפורום CODE613 ב24/08/2017 15:39 (+03:00)
-
מה זה הצהרה משתמעת?
a=1
זה לא הצהרה זה הכנסה למשתנה שכבר מוגדר.זו הצהרה משתמעת, כי מזה שאתה בא ואומר ש a שווה 1 משתמע שיש משתנה שנקרא a. ואע"פ שלא הצהרת מפורש, אבל JS בתהליך ההידור מבין שזה מה שאתה רוצה ועושה זאת במקומך.
וגם אם אתה עושה כךvar x; x = a;
זו גם הצהרה משתמעת אע"פ שזו קריאה ולא השמה. כי מתוך הקוד שלך משתמע שיש משתנה שנקרא a.
פורסם במקור בפורום CODE613 ב24/08/2017 19:47 (+03:00)
-
@avr416
אבל זה לא בגלל שמי שפיתח את השפה היה טיפש...אני אמרתי שהיה טיפש?!
אמרתי שאני לא מבין מדוע הצהרה משתמעת הופכת למשתנה גלובלי ולא למשתנה באותו סקופ, ועד כעת לא הצלחתי להבין, גם אחרי ההסבר של מאט.
באופן כללי בכל שפות התיכנות משתנה גלובלי זה דבר שעושים אותו לעיתים רחוקות אחרי שיקול דעת מעמיק, וזה בדיוק להיפך מהצהרה משתמעת שנעשית בכתיבת קוד קלילה, והרבה פעמים סתם בגלל טעות הקלדה.לא אמרת שהיה טיפש, אבל אתה מנסה להכניס את העקרונות של C# לJS, אתה צריך להפנים שזה ראש הפוך לגמרי.
C# אומרת: אני לא סומכת על המתכנת. לכן אני דורשת שהוא יצהיר בדיוק מה הפונקציה מחזירה, מה סוג הנתונים, צריך להגדיר קלאסים וכו' וכו'. יש בזה יתרון מאד גדול, ככה כבר בזמן ההידור של התוכנית - המהדר מתריע לך על שגיאות והקוד לא יתקמפל בגלל ששכחת להחזיר ערך מפונקציה או שהשתמשת בטיפוס לא מתאים וכו'.
ככה גם הקוד יותר ברור לאנשים אחרים שלא כתבו אותו - הם מבינים מה הולך, מה אתה מצפה לקבל, איזה נתונים הפונקציה מחזירה וכן על זה הדרך.JS לעומת זאת היא שפה מאד דינמית. היא בונה עליך המתכנת שאתה איש גדול, אתה לא עושה שטויות, ואתה בודק את הקוד שלך ב7 נפות, ולכן היא נותנת לך חופש עצום לעשות ככל העולה על רוחך. אתה בונה פונקציה ולא צריך להגדיר האם היא VOID או מחזירה ערך. כל פונקציה תחזיר undefinfd אא"כ תחזיר במפורש ערך אחר. אתה לא צריך להגדיר קלאסים וכו'. אתה יכול ליצור אובייקטים ולשנות אותם ככל העולה על רוחך לאחר מכן (להוסיף מאפיינים, להוריד וכו' - דבר שלא יעלה על הדעת בC#). בקיצר - JS אומרת: תהיה ילד גדול, ותאכל את השטויות שבישלת בעצמך! מאידך אם אתה יודע מה אתה עושה - היא נותנת לך הרבה הרבה כח!! וזה לענ"ד הייתרון הגדול שלה, שיש בו גם סיכון גדול.
בJS קשה מאד למצוא שגיאות שבC# לא היית מצליח לעשות אותם בכלל...פשוט אתה צריך להתרגל לראש הזה, ולא לנסות לחשוב מדוע הכסא איננו שולחן
זה 2 דברים שונים לגמרי..
פורסם במקור בפורום CODE613 ב24/08/2017 20:07 (+03:00)
-
לא אמרת שהיה טיפש, אבל אתה מנסה להכניס את העקרונות של C# לJS, אתה צריך להפנים שזה ראש הפוך לגמרי.
C# אומרת: אני לא סומכת על המתכנת. לכן אני דורשת שהוא יצהיר בדיוק מה הפונקציה מחזירה, מה סוג הנתונים, צריך להגדיר קלאסים וכו' וכו'. יש בזה יתרון מאד גדול, ככה כבר בזמן ההידור של התוכנית - המהדר מתריע לך על שגיאות והקוד לא יתקמפל בגלל ששכחת להחזיר ערך מפונקציה או שהשתמשת בטיפוס לא מתאים וכו'.
ככה גם הקוד יותר ברור לאנשים אחרים שלא כתבו אותו - הם מבינים מה הולך, מה אתה מצפה לקבל, איזה נתונים הפונקציה מחזירה וכן על זה הדרך.JS לעומת זאת היא שפה מאד דינמית. היא בונה עליך המתכנת שאתה איש גדול, אתה לא עושה שטויות, ואתה בודק את הקוד שלך ב7 נפות, ולכן היא נותנת לך חופש עצום לעשות ככל העולה על רוחך. אתה בונה פונקציה ולא צריך להגדיר האם היא VOID או מחזירה ערך. כל פונקציה תחזיר undefinfd אא"כ תחזיר במפורש ערך אחר. אתה לא צריך להגדיר קלאסים וכו'. אתה יכול ליצור אובייקטים ולשנות אותם ככל העולה על רוחך לאחר מכן (להוסיף מאפיינים, להוריד וכו' - דבר שלא יעלה על הדעת בC#). בקיצר - JS אומרת: תהיה ילד גדול, ותאכל את השטויות שבישלת בעצמך! מאידך אם אתה יודע מה אתה עושה - היא נותנת לך הרבה הרבה כח!! וזה לענ"ד הייתרון הגדול שלה, שיש בו גם סיכון גדול.
בJS קשה מאד למצוא שגיאות שבC# לא היית מצליח לעשות אותם בכלל...פשוט אתה צריך להתרגל לראש הזה, ולא לנסות לחשוב מדוע הכסא איננו שולחן זה 2 דברים שונים לגמרי..
אני יודע טוב מאוד שJS זה משהו אחר לגמרי, ולא מנסה להכניס את העקרונות של C# לJS.
אני שאלתי שאלה פשוטה ואני חוזר עליה שוב בפעם המי יודע כמה:
מדוע הצהרה משתמעת הופכת למשתנה גלובלי ולא למשתנה באותו סקופ
זה לא קשור לC# כי ב C# אין דבר כזה הצהרה משתמעת, זה שאלה ב JS מינא וביה.[size=85:2d9carw8]במאמר המוסגר דעתי האישית שהצורה שהצגת את השוני בין C# לJS ממש לא נכונה, גם בקטע של C# וגם בקטע של JS.
בקטע של C# שפה עם טיפוסיות חזקה זה לא בגלל שלא סומכים עליך אלא זה כלי כדי שלא תטעה. בדיוק כמו שלמסור חשמלי יש מגן שהאצבעות לא יכנסו בטעות. וכמו שיש בדיקת איות בוורד ובכל עורך תמלילים ואפילו כעת שאני כותב בתוך כרום את ההודעה הזו. אדם טועה כי הוא לא מלאך זה לא קשור לילד גדול או קטן. זה כמו שיבוא מהנדס ויבנה בנין עם איזה פתק ביד במקום לשרטט כל קיר ודלת וחלון על כמה וכמה דפים גדולים של A3. ויגיד תסמכו עלי אני מבין מה כתבתי בפתק...בקטע של JS, אמור לי מה המקור של השפה הזו? ובשביל מה היא נוצרה בכלל? כדי לכתוב ספריות קוד כמו שיש היום? או רק כדי לעשות את דפי האינטרנט מעט יותר דינמיים, ולכתוב פונקציה פה ופונקציה שם? הרי היא נוצרה בשביל שיבוא בעל אתר שלא מבין גדול בתיכנות, ולא למד הנדסת תוכנה ויעשה את האתר שלו קצת יותר מעניין בשביל זה נוצרה JS לפני כמה עשרות שנים, שאז לא היה צריך ספריות כמו jquery ודומהן. ובשביל זה היא מצויינת, אין טיפוסים הכל מופשט לא חייבים להצהיר הכל פלסטלינה השפה מבינה את ה"מתכנת" מצויין. JS נועדה לאנשים שלא מבינים גדולים בקוד. ולכן היא לא מבלבלת את המתכנת עם אינטרפייסים וירושה וכו'.[/size:2d9carw8]
פורסם במקור בפורום CODE613 ב24/08/2017 20:39 (+03:00)
-
זהו זה לא הצהרה משתמעת.
לכן אין קושיה.
הצהרה משתמעת כנראה יש ב C# לא ב JS.לגבי הקישוקשים על JS.
מעניין ש nodejs כל כך פופולארית אם זה כל כך גרוע.
נכון שזה שפה שנולדה איך שהוא.
אבל לא נהנה לתכנת עם C# . מה שכן אני נהנה לתכנת ב JS.
וזה טעם אישי.
ואמא שלי לימדה אותי שעל טעם וריח אין להתווכח.פורסם במקור בפורום CODE613 ב25/08/2017 00:20 (+03:00)
-
זהו זה לא הצהרה משתמעת.
לכן אין קושיה.
הצהרה משתמעת כנראה יש ב C# לא ב JS.תקרא לזה איך שאתה רוצה, למעשה זה יוצר משתנה גלובלי במקום מקומי וזה הפלא הגדול.
בC# אין מצב להצהרה משתמעת. ב VB אם רוצים אפשר.פורסם במקור בפורום CODE613 ב25/08/2017 11:18 (+03:00)
-
תקרא לזה איך שאתה רוצה, למעשה זה יוצר משתנה גלובלי במקום מקומי וזה הפלא הגדול.
זה לא פלא. ככה השפה עובדת, היא לא VB אלא JS.
זה כמו להקשות על אמורא אחד מדברי אמורא אחר. זה בכלל לא קושיא ולא שאלה!גם הפונקציה המקומית היא בעצם מאפיין של האובייקט הגלובלי ששמו window. אז בעצם הכל רץ בתוך הסקופ של הwindow.
פורסם במקור בפורום CODE613 ב25/08/2017 12:02 (+03:00)
-
זה לא פלא. ככה השפה עובדת, היא לא VB אלא JS.
זה כמו להקשות על אמורא אחד מדברי אמורא אחר. זה בכלל לא קושיא ולא שאלה!גם הפונקציה המקומית היא בעצם מאפיין של האובייקט הגלובלי ששמו window. אז בעצם הכל רץ בתוך הסקופ של הwindow.
מותר לאמורא אחד לחלוק על השני, אבל לא קובעים שיש כאן מחלוקת אלא אם יש הכרח לכך
וגם כשברור שחולקים מבררים במה הם חולקים? למה האחד אמר כך והשני אמר אחרת
גם פה אני שואל, הרי ההגיון אומר שאם ההופעה הראשונה של המשתנה נמצאת בסקופ פנימי אזי JS אמור ליצור משתנה פנימי ולא גלובלי
א. כי שם הוא נמצא
ב. כי משתנים גלובלים מסוכנים
ג. כי הצהרה משתמעת מסוכנת ויש לצמצם אותה למינימום.
אז אתה אומר לי זה "לא פלא ככה השפה עובדת", נכון שכך היא עובדת, אני שואל למה? למה אותו אחד שבנה אותה עשה כך?פורסם במקור בפורום CODE613 ב25/08/2017 12:07 (+03:00)
-
אני יסביר לך למה אין.
אתה חושב ש JS מוסיף הצהרה מתי שהוא רואה שיש רק a=1
אבל זה לא נכון.
בזמן ריצה שיש a=1 הוא מנסה להכניס 1 למשתנה שכבר קיים.
ואז הוא בודק בסקופ הנוכחי אם אין הוא עולה הלאה עד שהוא מגיע ל root כפי שהסבירו פה קודם.אם הוא היה מגדיר בסקופ הנוכחי וזה מה שהסברתי פה קודם. זה היה יוצר מצב שמתכנתים היו משתמשים בזה.
ואז המצב היה פי כמה יותר גרוע.
כלומר מבחינת JS
a=1 בלי הצהרה זה לא תקין. כלומר אין "הצהרה משתמעת" כפי שאתה קורא לזה.פורסם במקור בפורום CODE613 ב25/08/2017 12:08 (+03:00)
-
אני יסביר לך למה אין.
אתה חושב ש JS מוסיף הצהרה מתי שהוא רואה שיש רק a=1
אבל זה לא נכון.
בזמן ריצה שיש a=1 הוא מנסה להכניס 1 למשתנה שכבר קיים.
ואז הוא בודק בסקופ הנוכחי אם אין הוא עולה הלאה עד שהוא מגיע ל root כפי שהסבירו פה קודם.אם הוא היה מגדיר בסקופ הנוכחי וזה מה שהסברתי פה קודם. זה היה יוצר מצב שמתכנתים היו משתמשים בזה.
ואז המצב היה פי כמה יותר גרוע.
כלומר מבחינת JS
a=1 בלי הצהרה זה לא תקין. כלומר אין "הצהרה משתמעת" כפי שאתה קורא לזה.הפוך ממה שאמרת
JavaScript processes all variable declarations before executing any code, whether the declaration is inside a conditional block or other construct. Once JavaScript has found all the variables, it executes the code in the function. If a variable is implicitly declared inside a function - that is, if it appears on the left side of an assignment expression but has not been declared with var - it is created as a global variable.
מכאן
https://docs.microsoft.com/en-us/scripting/javascript/advanced/variable-scope-javascriptפורסם במקור בפורום CODE613 ב25/08/2017 12:18 (+03:00)
-
ופה יש מאמר מעניין בעיניין "האימה של גלובלי"
http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html
טוען שהצהרה משתמעת שהופכת למשתנה גלובלי זה פשוט תופעת לואי !פורסם במקור בפורום CODE613 ב25/08/2017 12:21 (+03:00)
-
אוקי אני לא ממש בדקתי את הקומפיילר.
תראה אתה משתמש במונח הצהרה משתמעת שזה לא מונח נכון.
אתה כנראה מכיר את זה מ 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)