7

假设我有以下代码:

var secrets;
Array = function() {
  secrets = this;
};

上述示例的作者说代码正在重新定义 Array 构造函数。首先,我不确定this指的是什么。有人可以请教吗?

第二:下面的代码是等价的吗?

var secrets;
function Array() {
  secrets = this;
}

顺便说一下,上面的代码取自以下关于 Json 漏洞的文章:见这里

4

2 回答 2

5

在这两个示例中,您都将变量定义Arrayfunction分配thissecrets. 碰巧已经存在一个全局对象,称为Array页面中的其他 JS 可能会或可能不会用作Constructor创建数组。如果您弹出控制台并将 Array 重新分配为其他内容,您可能会开始从显式依赖Array. 但是,字面上用 with 制作的数组[]仍然可以正常工作,事实上,它们__proto__仍然指向Array.prototype. 所以:

var arr1 = new Array('a','b','c');
// arr[0] -> 'a'

var arr2 = ['d','e','f'];
// arr[0] -> 'd'

var secrets;
Array = function() { secrets = this; };

var arr3 = new Array('g','h','i'); // nothing wrong here, because Array is a function
// arr3[0] -> undefined
// Array is just a function, you can't make arrays with new Array anymore
// and arr3 is just a function


var arr4 = ['j','k','l'];
// arr4[0] -> 'j'
// making array literals still works

至于this,没什么奇怪的,还是遵循着的规则this。您分配函数的事实Array不会改变this行为方式。所以this指向浏览器中的全局对象,window除非您实例化new或使用callapply

两个示例之间的区别在于函数表达式和函数声明之间的区别,请参阅:Javascript 中函数表达式与声明之间的区别是什么?

于 2013-03-13T13:09:07.467 回答
1

是的,两个片段是等效的。两者都重新定义了数组构造函数,以试图拦截注入它的网站使用的所有数组数据,如链接文章中所述。的值this应该是新构造的数组。

这似乎是 ECMAScript 3 允许的,但 ECMAScript 5 不允许,现在所有现代浏览器都可以使用。所以文章中描述的漏洞应该不再起作用。

于 2013-03-13T13:05:58.993 回答