חידה ב-JS: מה קוד זה עושה?
-
@WWW
זה סתם פיסת טריוויה שלא שווה הרבה בעולם האמיתי
יש כלל מוזר שאם קראת ל-eval ישירות אז ה-scope שלו הוא הסקופ הלוקלי, ואם קראת לו בעקיפין אז הוא מקבל את הסקופ הגלובלי
(זה דומה קצת למה שפעם כתבנו שאם קוראים לפונקציה ישירות על אובייקט אז ה-this שלו הוא האובייקט, ואם קראת לו בעקיפין הוא מקבל את ה-this הגלובלי) -
@yossiz אם כבר הגעת לEVAL אולי אתה נתקל בבעיות ביצועים בקוד שלך, האם ניסית את הטכנולוגיה להאצת ביצועים של לינוקס?
השראה
-
(eval)('x') eval('x')
2 השורות האלה שוות, במקרה הנ"ל אתה מוסיף עוד פרמטר בסוגריים כדי לגרום שהEVAL המוחזר יקבל את הסקופ הגלובלי
תראה בלינק שדוד הביא
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comma_Operator
כשאתה מכניס 2 פרמטרים בסוגריים, הפרמטר האחרון הוא הערך שמוחזר, אז במקרה הזה המהדר עיבד את הפרמטר 1 וכמובן לא עשה איתו כלום, ואחר כך החזיר את הפונקציה eval -
@חוקר ראשית הבאתי לינק מקודם שאומר שבJS סוגריים עם ערכים מופרדים בפסיק מחזירים את הערך האחרון.
כלומר:var val = ("דגים", {obj: true}, 55); console.log(val); //55
דבר נוסף: פונקציה זה ערך שניתן לשים במשתנה ולהפעיל אותו, למשל:
var myFunc = console.log; myFunc(123); //123
ממילא:
var val = (123, console.log); val("HI!"); //HI
ובשורה אחת:
(123, console.log)("HI!"); //HI
תוך כדי כתיבה אני רואה ש@יוסף-בן-שמעון הקדים אותי אבל מרחמנות על עצמי אני מפרסם גם הודעתי.
-
@חוקר אם היית שואל אותי אם לבזבז את הזמן שלך על זה הייתי עונה שלא. אבל מה לעשות שלא שאלת אותי... אז אני אענה על מה שכן שאלת...
האם יש הבדל? כן. ההבדל הוא שבבטוי הראשון קיבלת אתeval
בעקיפין, כתוצאה של פענוח ביטוי. בשני הזכרת אותה ישירות. ויש כלל מוזר שהסקופ של eval תלוי על הדרך שבו אתה קורא אותה. למה? ככה. (מן הסתם יש הגיון אבל אני לא יודע אותה).
מה זה מוסיף לחיים שלך? כלום...