eval
не является зарезервированным словом . Это просто свойство на window
или на globalThis
(например, global
на узле). Нет причин, по которым не может быть свойства с одинаковым именем в другом объекте (прототип Foo
).
Все они действительны, и все они создают свойство с ключом eval
для некоторого объекта:
function Foo(){}
Foo.prototype.eval = function(){};
new Foo().eval();
class Foo{
eval(){}
}
new Foo().eval();
({
eval: function(){}
}).eval();
Если пойти еще дальше, даже если eval
было зарезервированным словом, все они все равно будут действительны. Это действительно, потому что методы могут иметь любое имя:
class Foo{
if(){}
}
new Foo().if();
({
if(){},
var(){},
for(){},
switch(){}
}).var();
Вы просто не можете использовать их сами по себе, например const if = new Foo().if;
или const {if} = new Foo();
, если они являются зарезервированными словами. eval
здесь будет хорошо; это просто переписало бы window.eval
.