Почему пустой метод в JavaScript работает как приемник?

Я определяю объект a с помощью пустого метода b(). Метод не имеет параметров и ничего не делает!

Скажите мне, пожалуйста, почему, когда я вызываю a.b() и передаю код JS в качестве параметра, он выполняет этот код?

var a = {
  b() {}
}

a.b('' - alert(1) - '');

Он работает как приемник, например, eval, setInterval, setTimeout, дает код JS и выполняет его!

Задумайтесь на секунду о том, что делает код. Чтобы передать аргумент ''-alert(1)-'' в функцию b(), его необходимо обработать. Поэтому вызывается alert(1), и его возвращаемое значение (неопределенное) математически вычитается из пустых строк, а затем передается в b(), где ничего дополнительного не происходит.

Rory McCrossan 03.05.2024 17:50

любой интерпретатор выполнит оценку '' - alert(1) - '', а затем вернет результат в качестве аргумента в вашем «пустом методе»

Mister Jojo 03.05.2024 18:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возможно, ваше непонимание связано с синтаксисом.

Если вы подумаете о том, что передаете a.b(), и просто вставите это в консоль, вы увидите:

> ''-alert(1)-''
NaN

потому что вы здесь занимаетесь «математикой»: пустая строка '' минус возврат вызова функции alert(1) (который возвращает undefined), а затем минус еще одна пустая строка.

Если вы сделали то же самое с плюсом, JavaScript объединил бы все в одну строку:

> ''+alert(1)+''
"undefined"

По сути, ваш код выполняется до того, как что-либо будет передано в функцию a.b. Если вы не хотите, чтобы это произошло, вам придется правильно процитировать вызов alert(1) одним из следующих способов:

'alert(1)'
"alert(1)" // but not ''alert(1)''
`alert(1)`

Следовательно, это не имеет никакого отношения конкретно к вашей функции.

Спасибо. я понял, как это работает!

KeepCalmBaby 03.05.2024 18:11

Возможно, вам будет полезно подумать о порядке выполнения кода.

  1. В этом случае, даже если вам не требуется какой-либо параметр в методе объекта, благодаря гибкости JavaScript сначала он не выдаст никаких ошибок.
  2. Кроме того, если вы передадите методу результат выполнения другого в качестве аргумента, он запустит его и получит результат, даже если вы его не используете и не требуете. Этот код будет делать то же самое, что и ваш, но поможет вам увидеть, что происходит.
const a = {
   b(hiddenArgument){
       // Doesn't do anything with the argument. If not passed will be undefined.
   }
};
const process = alert(1); // This will be executed as long as you invoke it in this line and will return undefined.
a.b('' - process - '');

Теперь, если вы хотите, чтобы функция выполнялась условно, по вашему желанию, вы можете попробовать использовать обратный вызов.

const a = {
   b(callback){
       if (some_condition){
          let data = callback();
          // Here you can do something with your data.
       }
   }
};
const process = () => '' - alert(1) - ''; // This will be executed as long as you invoke it inside the function.
a.b(process);

Другие вопросы по теме