JS,在脚本的开头将 fetch 之类的引用给 delete,后面还有办法能获取到吗?

2021-06-05 17:52:24 +08:00
 xieqiqiang00
比如
delete globalThis.fetch
....

还有可能再次获取到 fetch 吗?


或者
delete ArrayBuffer
...

还有可能再创建 ArrayBuffer(new ArrayBuffer(8))吗?
2631 次点击
所在节点    JavaScript
22 条回复
xieqiqiang00
2021-06-07 22:05:44 +08:00
@love 我尝试了一下,delete 之后即使是 XHR 返回的 arraybuffer 也是指向的全局里的 arraybuffer,如果我删了全局的 arraybuffer,虽然 XHR 可以返回 arraybuffer 对象但没法再构造新的 arraybuffer 了

代码如下
{
delete ArrayBuffer//不 delete 这个,后面的 new arraybuffer(8)是可以执行成功的
//ArrayBuffer 的引用已被清除
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://cdn.jsdelivr.net/gh/WildXBird/r6sground.cn/cache.txt", true)
xhr.responseType = "arraybuffer"
xhr.send()
xhr.onreadystatechange = () => {
if (xhr.readyState == XMLHttpRequest.DONE) {
if (xhr.status >= 200 && xhr.status <= 300) {
let res = xhr.response
console.log(typeof (res))
console.log(res)
let arraybuffer = res["__proto__"].constructor
const buffer = new arraybuffer(8);
console.log(buffer.byteLength);
}
}
}
}
xieqiqiang00
2021-06-07 22:14:34 +08:00
@love 上面的代码有问题,这个才对
{
let tab = new ArrayBuffer(8)
tab["__proto__"].constructor = {}//不重写这个,后面的 new arraybuffer(8)是可以执行成功的
delete tab
//ArrayBuffer 的引用已被清除
const xhr = new XMLHttpRequest();
xhr.open("GET", "https://cdn 点 jsdelivr 点 net/gh/WildXBird/r6sground.cn/cache.txt", true)
xhr.responseType = "arraybuffer"
xhr.send()
xhr.onreadystatechange = () => {
if (xhr.readyState == XMLHttpRequest.DONE) {
if (xhr.status >= 200 && xhr.status <= 300) {
let res = xhr.response
console.log(typeof (res))
console.log(res)
let arraybuffer = res["__proto__"].constructor
const buffer = new arraybuffer(8);
console.log(buffer.byteLength);
}
}
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/781581

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX