Я определяю объект a
с помощью пустого метода b()
. Метод не имеет параметров и ничего не делает!
Скажите мне, пожалуйста, почему, когда я вызываю a.b()
и передаю код JS в качестве параметра, он выполняет этот код?
var a = {
b() {}
}
a.b('' - alert(1) - '');
Он работает как приемник, например, eval, setInterval, setTimeout, дает код JS и выполняет его!
любой интерпретатор выполнит оценку '' - alert(1) - ''
, а затем вернет результат в качестве аргумента в вашем «пустом методе»
Возможно, ваше непонимание связано с синтаксисом.
Если вы подумаете о том, что передаете 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)`
Следовательно, это не имеет никакого отношения конкретно к вашей функции.
Спасибо. я понял, как это работает!
Возможно, вам будет полезно подумать о порядке выполнения кода.
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);
Задумайтесь на секунду о том, что делает код. Чтобы передать аргумент
''-alert(1)-''
в функциюb()
, его необходимо обработать. Поэтому вызываетсяalert(1)
, и его возвращаемое значение (неопределенное) математически вычитается из пустых строк, а затем передается вb()
, где ничего дополнительного не происходит.