חידה ב-JS: מה קוד זה עושה?
-
@yossiz אמר בחידה ב-JS: מה קוד זה עושה?:
מה התכוון המשורר כאן?
var x = 123; var a = x; // 123 var b = eval('x'); // 123 var c = (1, eval)('x'); // 123 var d = (Function()(console.log(x++)), eval)('x'); // 124
הבנתי נכון?
-
@WWW התשובה צריכה להיות על השאלה למה הוא כתב ככה:
(1, eval)('x')
ולא פשוט יותר ככה:
eval('x')
לא רואה בקוד שלך תשובה על כך,
במאמר שמה יש הבדל בסקופ, שהדרך הפשוטה לוכדת את הסקופ הנוכחי והטריקית לוקחת את הגלובלי. -
@dovid
הבנתי, ככה?var x = 123; var z = function() { var x = 456; b = eval('x'); // 456 c = (1, eval)('x'); // 123 }
מה ההסבר בזה?
@WWW
זה סתם פיסת טריוויה שלא שווה הרבה בעולם האמיתי
יש כלל מוזר שאם קראת ל-eval ישירות אז ה-scope שלו הוא הסקופ הלוקלי, ואם קראת לו בעקיפין אז הוא מקבל את הסקופ הגלובלי
(זה דומה קצת למה שפעם כתבנו שאם קוראים לפונקציה ישירות על אובייקט אז ה-this שלו הוא האובייקט, ואם קראת לו בעקיפין הוא מקבל את ה-this הגלובלי) -
@WWW
זה סתם פיסת טריוויה שלא שווה הרבה בעולם האמיתי
יש כלל מוזר שאם קראת ל-eval ישירות אז ה-scope שלו הוא הסקופ הלוקלי, ואם קראת לו בעקיפין אז הוא מקבל את הסקופ הגלובלי
(זה דומה קצת למה שפעם כתבנו שאם קוראים לפונקציה ישירות על אובייקט אז ה-this שלו הוא האובייקט, ואם קראת לו בעקיפין הוא מקבל את ה-this הגלובלי) -
מה התכוון המשורר כאן?
(1, eval)('x')
(אל תדאגו, אם אתם לא יודעים לענות זה לא אומר כלום על יכולות התכנות שלכם... בכל מקרה השימוש ב-
eval
אמור להיות שמור למקרים מיוחדים בלבד)
תשובה: https://2ality.com/2014/01/eval.html@yossiz אם כבר הגעת לEVAL אולי אתה נתקל בבעיות ביצועים בקוד שלך, האם ניסית את הטכנולוגיה להאצת ביצועים של לינוקס?
השראה
-
@dovid
הבנתי, ככה?var x = 123; var z = function() { var x = 456; b = eval('x'); // 456 c = (1, eval)('x'); // 123 }
מה ההסבר בזה?
-
(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
תוך כדי כתיבה אני רואה ש@יוסף-בן-שמעון הקדים אותי אבל מרחמנות על עצמי אני מפרסם גם הודעתי.
-
אז בעצם הספרה אחת שנמצאת בתחילת הסוגרים למעשה לא משמשת לכלום?
או יותר נכון, האם יש הבדל בין(1, eval)('x')
ל
(eval)('x')
@חוקר אם היית שואל אותי אם לבזבז את הזמן שלך על זה הייתי עונה שלא. אבל מה לעשות שלא שאלת אותי... אז אני אענה על מה שכן שאלת...
האם יש הבדל? כן. ההבדל הוא שבבטוי הראשון קיבלת אתeval
בעקיפין, כתוצאה של פענוח ביטוי. בשני הזכרת אותה ישירות. ויש כלל מוזר שהסקופ של eval תלוי על הדרך שבו אתה קורא אותה. למה? ככה. (מן הסתם יש הגיון אבל אני לא יודע אותה).
מה זה מוסיף לחיים שלך? כלום...