创建函数对象时奇怪的模板字符串行为
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
调用它。
当我在应对 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
调用它。