创建函数对象时奇怪的模板字符串行为

Weird Template Strings behavior when creating Function object

当我在应对 XSS 挑战时,我在 Javascript.

中使用模板字符串(`` 而不是圆括号)创建 Function 对象时遇到了奇怪的行为

据我了解,当调用

alert`1`

本质上与

相同

alert(["1"])

如所述here。我测试了很多情况,并且在任何地方都以这种方式工作 - 除了使用模板字符串创建 Function 对象时。

执行以下代码时:

var x = new Function`alert(1)`;
console.log(x.constructor);

Object class 的实例是在其构造函数主体中使用 alert(1) 函数创建的,因此会立即执行。

如果我没理解错,应该和

一样执行

var y = new Function(["alert(1)"]);
console.log(y.constructor)

并且应该 return 主体中带有 alert(1) 的函数对象,这样它就可以像这样调用

var y = new Function(["alert(1)"]);
y();

这种不一致从何而来,或者在创建对象时模板字符串的处理方式不同?

您误解了各种语言语法的优先级。

var x = new Function`alert(1)`;

等同于

var x = new (Function`alert(1)`);

所以你实际上在做的是

var fn = Function`alert(1)`;
var x = new fn;

所以你已经创建了函数,然后用 new 调用它。