ביאור הקוד if window !== top ב JS
-
@דוד ל.ט.
אני במקומך הייתי עונה לavr16 "אהה הבנתי אתה צודק" ולא מסתייג מנורמליות העניין ומתחיל להסביר שזה מסוכן. מה הוא אשם שזה לא התנהגות נורמלית בעיניך? הוא סה"כ סיפר לך עובדה במה שרצית להבין.
אמרתי שהוא אשם?!
אין פה אף אחד אשם, רק JS בלבד.
אתה רוצה שאני אגיד "אהה הבנתי אתה צודק", באמת לא הבנתי, רק אני מקבל את העובדות, אבל לא מבין את הראש של מהנדסי השפה העילגת הזו, וזה גם לא קשור לצודק או לא, כי אלו עובדות.פורסם במקור בפורום CODE613 ב24/08/2017 10:24 (+03:00)
-
מצאתי כאן
https://www.w3schools.com/js/js_scope.asp
שבאמת זו ההתנהגות הרשמית של JS ואכן יש שם אזהרה שלא להצהיר בלי VAR כדי לא ליצור משתנים גלובלים.:!: זה אחד המקומות ש JS מתנהג לא כמצופה ובצורה לא הגיונית בעליל וגם מסוכנת בזה שמשתנה גלובלי יכול לשכתב בטעות פונקציות ומשתנים אחרים.
לא הבנתי מה לא מצופה בזה ומה מסוכן בזה. אם אתה יודע מראש שכל המשתנים הם גלובליים ואתה מתנהג בהתאם אז מה ההבעיה.
פורסם במקור בפורום CODE613 ב24/08/2017 11:09 (+03:00)
-
לא הבנתי מה לא מצופה בזה ומה מסוכן בזה. אם אתה יודע מראש שכל המשתנים הם גלובליים ואתה מתנהג בהתאם אז מה ההבעיה.
שפת תיכנות טובה צריכה להיות בנויה באופן שהמתכנת באופן אינטואיטיב יזרום עם השפה, ובוודאי שהשפה לא אמורה להתנהג באופן המנוגד להגיון. נכון שאם אתה יודע את הדפקט הזה בשפה ואתה עוקף אותו לא קורה כלום, אבל עדיין יש פה דפקט.
פורסם במקור בפורום CODE613 ב24/08/2017 11:24 (+03:00)
-
@דוד ל.ט.
אני במקומך הייתי עונה לavr16 "אהה הבנתי אתה צודק" ולא מסתייג מנורמליות העניין ומתחיל להסביר שזה מסוכן. מה הוא אשם שזה לא התנהגות נורמלית בעיניך? הוא סה"כ סיפר לך עובדה במה שרצית להבין.אמרתי שהוא אשם?!
אין פה אף אחד אשם, רק JS בלבד.
אתה רוצה שאני אגיד "אהה הבנתי אתה צודק", באמת לא הבנתי, רק אני מקבל את העובדות, אבל לא מבין את הראש של מהנדסי השפה העילגת הזו, וזה גם לא קשור לצודק או לא, כי אלו עובדות.שאלת שאלה וענו לך.
השאלה הייתה איך זה, וענו לך מה הכלל הקובע ומה ההתנהגות העקבית והמתועדת.
לא שאלת מה הראש של מתכנתי השפה ולא שום דבר בכיוון כלל.
לא זו בלבד שלא נתת תודה או אמרת את המילה נכון, אתה מטה את הדיון ל"נכון שזה ככה אבל זה עקום".
היית אמור לסמן כנפתר ולגמור עם האשכול מייד אחרי תשובתו של avr416.
להגיד שJS דפוקה אתה יכול לומר בהערת אגב, ולא באופן שיראה כאילו מהתחלה הייתה כונה לומר "JS היא דפוקה, והראיה שאינני יודע מה הtop הזה נכנס פה".לגופו של עניין, כיון שאיך שהתרשמתי אינך מפרגן לשפת תכנות וטכנלוגיה שאינך מכיר זכות קיום עד שיביאו לך הוכחה על טובה, אז דעתך על JS לא משכנעת במיוחד.
פורסם במקור בפורום CODE613 ב24/08/2017 12:15 (+03:00)
-
@דוד ל.ט.
שאלת שאלה וענו לך.
השאלה הייתה איך זה, וענו לך מה הכלל הקובע ומה ההתנהגות העקבית והמתועדת.
לא שאלת מה הראש של מתכנתי השפה ולא שום דבר בכיוון כלל.
לא זו בלבד שלא נתת תודה או אמרת את המילה נכון, אתה מטה את הדיון ל"נכון שזה ככה אבל זה עקום".
היית אמור לסמן כנפתר ולגמור עם האשכול מייד אחרי תשובתו של avr416.
להגיד שJS דפוקה אתה יכול לומר בהערת אגב, ולא באופן שיראה כאילו מהתחלה הייתה כונה לומר "JS היא דפוקה, והראיה שאינני יודע מה הtop הזה נכנס פה".לגופו של עניין, כיון שאיך שהתרשמתי אינך מפרגן לשפת תכנות וטכנלוגיה שאינך מכיר זכות קיום עד שיביאו לך הוכחה על טובה, אז דעתך על JS לא משכנעת במיוחד.
לשאלה ששאלתי בפתיחת האשכול אתה ענית וקיבלת כמה וכמה תודות
אחר כך נשאלה שאלה אחרת שעליה ניסה avr416 לענות, והתשובות שלו לא סיפקו אותי
@avr416@רחמים
מעניין, מתי אני בעצם לא נמצא בתוך windowלמשל ניסתי להריץ את הקוד הבא בקונסולה וקיבלתי אותה תוצאה כמו הקוד שלך
(function(){a = 123; console.log(window.a);})()
התשובה היא כמו שדוד כתב, בדפדפן תמיד הסקופ הכי בסיסי הוא window, זוהי הפונקציה הכי ראשונית שבתוכה כל הקוד שלך רץ, ולכן תמיד תמיד אתה יכול לגשת אליו.
ולא אמרתי קבלו דעתי ולא באתי לשכנע.
ובכלל אני לא מבין למה לך להסיט את האשכול מדיבורים עניינים על JS לפסים אישיים של אני במקומך וכו' וכו' אם כל כך חשוב לך להגיד לי את זה תכתוב באישי.פורסם במקור בפורום CODE613 ב24/08/2017 12:25 (+03:00)
-
טוב, נניח שמאחרי התשובה שלי מתחילה שאלה חדשה, אינני מבין במה avr416 לא ענה לך ומה שייך פה תשובה מספקת כשהשאלה היא "מעניין מתי אני לא נמצא בסקופ".
כשאתה כותב מעניין למה ומישהו עונה ותשובתו נכונה, אל לך לענות לו בשאלה אחרת.פורסם במקור בפורום CODE613 ב24/08/2017 12:31 (+03:00)
-
ליתר המחשה, שאלה ותשובה:
@avr416
התשובה היא כמו שדוד כתב, בדפדפן תמיד הסקופ הכי בסיסי הוא window, זוהי הפונקציה הכי ראשונית שבתוכה כל הקוד שלך רץ, ולכן תמיד תמיד אתה יכול לגשת אליו.אבל הצהרתי על המשתנה a בתוך סקופ בפני עצמו שזה הפונקציה האנונימית ואיך JS הבין שכוונתי להצהיר על משתנה בתוך הסקופ של window?
אבל הצהרתי על המשתנה a בתוך סקופ בפני עצמו שזה הפונקציה האנונימית ואיך JS הבין שכוונתי להצהיר על משתנה בתוך הסקופ של window?
הטעות שלך היא שלא הכרזת עליו עם var אלא השמת את הערך 123 לתוך משתנה שהנחת שהוא קיים בשם a, ממילא בעצם יצרת מאפיין לwindow בשם a עם ערך של 123.
אם היית כותב ככה:(function(){var a = 123; console.log(window.a);})()
היית מקבל undefined
מה שכתבת שקול לקוד הזה:
var person = {} person.a = 123 console.log(person.a)
רק שבמקום person בעצם מאחורי הקלעים יש את האובייקט window
פורסם במקור בפורום CODE613 ב24/08/2017 12:37 (+03:00)
-
רחמים ככה שליטתך זה אמור לעבוד טוב ככה חייבים לעשות var. ואז זה נהיה קצת שפה עם כללים.
בכל מקרה לו יצוייר ולא היה צריך לעשות var מתנכת היה כותב פונקציה עם משתנה פנימי בלי var והיה מסתמך על זה שזה לא מופיע בגלובל.
היה אפשר לשבור לו את הפונקציה ע"י הכנסת משתנה לגלובל.
לכן הגיוני יותר להכריח לכתוב var כדי לסמן הקצאה של משתנה חדשה. שלא מושפע מהסקופים העליוניים.פורסם במקור בפורום CODE613 ב24/08/2017 13:12 (+03:00)
-
רחמים ככה שליטתך זה אמור לעבוד טוב ככה חייבים לעשות var. ואז זה נהיה קצת שפה עם כללים.
לשיטתי JS היה צריך לחייב לכתוב VAR ואין דבר כזה הצהרה משתמעת
ובכל זאת אין פלא על JS שהוא מתיר הצהרה משתמעת זה יש בהרבה שפות, אם כי לא בהכרח שזה טוב
הפלא הוא שההצהרה המשתמעת תמיד הופכת למשתנה גלובלי במקום להיות תקפה רק בתחום הסקופ שבו הייתה ההצהרה.בכל מקרה לו יצוייר ולא היה צריך לעשות var מתנכת היה כותב פונקציה עם משתנה פנימי בלי var והיה מסתמך על זה שזה לא מופיע בגלובל.
היה אפשר לשבור לו את הפונקציה ע"י הכנסת משתנה לגלובל.איך זה שובר לא הבנתי? הרי אם יש שתי משתנים בעלי שם זהה אחד בסקופ שבו אתה נמצא ואחד בסקופ יותר כללי, ואתה משתמש במשתנה ברור שכוונה שלך למשתנה שבסקופ הפרטי יותר ולא הכללי. ככה בכל שפות שאני מכיר. הפרטי דורס את הכללי ולא להפך.
פורסם במקור בפורום CODE613 ב24/08/2017 13:21 (+03:00)
-
כן אבל בלי VAR הפרטי משפיע על הכללי. לא רק דורס אותו לצרכים פנימיים.
זה כמובן אם לו יצוייר זה היה מתנהג לעיתים כסקופ פנימי ולעיתים כחיצוני.
כמו שאמרת שההגיון שלך זה שגם אם אתה כותב בלי VAR ואין את זה בשום סקופ זה אמור להיות פרטי. ואם כן יש את זה באיזה שהוא סקופ.
זה אמור להיות מתייחס לשמה.פורסם במקור בפורום CODE613 ב24/08/2017 13:24 (+03:00)
-
וזה בדיוק האבסורט של JS שאם הוא מתיר הצהרה משתמעת היה עליו לפחות לצמצם אותה לאותו הסקופ ולא להפוך לגלובלי
מה שקורה כיום שאדם יכול עם טעות של הקלדה ליפול להצהרה משתמעת וזה גם בהכרח יהפוך למשתנה גלובלי ואולי גם ידרוס משהו והוא אפילו לא יקבל שגיאה בהידור רק בריצה הדברים לא יעבדו. מזל שהוסיפו את "use strict" שפוסל הצהרות משתמעות.פורסם במקור בפורום CODE613 ב24/08/2017 13:31 (+03:00)
-
function (){ var a = ""; function(){ a = 1; } }
הצהרה ללא var מתרשת בשורה 4.
כרגע זה מתייחס למשתנה שנמצא בשורה 2.
אתה רוצה לומר שאם אין את זה ב global שזה יתיחס לפנימי. כלומר כמו VAR.
כדי שמתכנתים ישתמשו בזה כדי להשתמש בזה בתוך משתנה פנימי.
וזה היה עושה הרבה בעיות. כי לעיתים זה היה פנימי. ולעיתים זה היה חיצוני. תלוי אם ה a הוגדר קודם.
לכן הכי פשוט שתמיד שלא עושים VAR זה חיצוני. ואם אין שום הגדרה זה הולך לסקופ העליון.
יש מקום לדיון האם לפלוט שגיאה בכזה מצב.
אבל אני בדעה שלא לפלוט שגיאה. טעם אישי. אין טעם להתווכח על זה.פורסם במקור בפורום CODE613 ב24/08/2017 14:15 (+03:00)
-
לשאלה ששאלתי בפתיחת האשכול אתה ענית וקיבלת כמה וכמה תודות
אחר כך נשאלה שאלה אחרת שעליה ניסה avr416 לענות, והתשובות שלו לא סיפקו אותילא הבנתי מה מצאת בקישור שהבאת יותר ממה שעניתי לך..
וזה מה שדוד התכוון לענ"ד.
אם היית מעיין יותר בתשובה היית רואה שכתבתי שכיון שהוא לא מוצא משתנה כזה, הוא בעצם יוצר מאפיין חדש לאובייקט הגלובלי בשם הזה. וזה לא התנהגות חריגה כי JS תמיד מאפשר לך לשנות אובייקטים לאחר שהם נוצרו ולהוסיף להם מאפיינים. (בעצם כל משתנה גלובלי הוא מאפיין של האובייקט window, אז לכן אוט' אם לא הצהרת עליו בשום מקום הוא מניח שזה מה שהתכוונת לעשות).
אתה רגיל לשפות עם טיפוסיות חזקה ולכן אתה מתעצבן על JS וגם אני הייתי ככה בהתחלה..
אבל היום אני רואה את הכח העצום שזה נותן לך כמתכנת, לכתוב ישירות את הקוד שאתה צריך בלי להתחיל ולהתעסק באלף ואחד דברים מסביב, (שאמורים לעזור לך בהמשך ולהצילך מטעויות..).
JS כשפה נותנת לך חופש גדול ועצום, וסומכת עליך שתדע איך להשתמש בו.
C# לא סומכת עליך, ולכן מכריחה אותך להצהיר על כל דבר וענין.
לכל שפה יש את היתרונות שלה, אבל זה לא בגלל שמי שפיתח את השפה היה טיפש...
תנסה להבין את הראש וכך יהיה לך יותר קל לעבוד עם זה.בהצלחה!
פורסם במקור בפורום CODE613 ב24/08/2017 14:39 (+03:00)
-
אבל זה לא בגלל שמי שפיתח את השפה היה טיפש...
אני אמרתי שהיה טיפש?!
אמרתי שאני לא מבין מדוע הצהרה משתמעת הופכת למשתנה גלובלי ולא למשתנה באותו סקופ, ועד כעת לא הצלחתי להבין, גם אחרי ההסבר של מאט.
באופן כללי בכל שפות התיכנות משתנה גלובלי זה דבר שעושים אותו לעיתים רחוקות אחרי שיקול דעת מעמיק, וזה בדיוק להיפך מהצהרה משתמעת שנעשית בכתיבת קוד קלילה, והרבה פעמים סתם בגלל טעות הקלדה.פורסם במקור בפורום 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)