DOM节点和javascript命名空间之间的关系是什么?

DOM节点和javascript命名空间之间的关系是什么?,javascript,reactjs,jestjs,jsdom,react-testing-library,Javascript,Reactjs,Jestjs,Jsdom,React Testing Library,在本例中,为什么变量foo不会引发ReferenceError?没有变量声明,但在呈现DOM后,它显然在范围内。DOM节点id和javascript命名空间之间的关系是什么?我正在用jest运行此程序 从“React”导入React; 从'@testing library/react'导入{render} test('呈现div',()=>{ const{utils}=render() 期望值(foo).期望值(true) }) 笑话报道: Expected: true Received: &

在本例中,为什么变量
foo
不会引发
ReferenceError
?没有变量声明,但在呈现DOM后,它显然在范围内。DOM节点id和javascript命名空间之间的关系是什么?我正在用
jest
运行此程序

从“React”导入React;
从'@testing library/react'导入{render}
test('呈现div',()=>{
const{utils}=render()
期望值(foo).期望值(true)
})
笑话报道:

Expected: true
Received: <div id="foo" />
应为:true
收到:

我真的希望测试会崩溃,因为在我的真实示例中,我意外地将一个未定义的变量传递给了
expect()
,它恰好与呈现的DOM节点的id同名。

具有id的元素成为全局变量

不是同一个问题,但你的问题的答案是另一个问题:


-

浏览器这样做是出于愚蠢的遗留原因。@Pointy您能提供一个记录此行为的源代码吗?
document.write(“”);console.log(window.foo)
@roberts可能很好,但我已经和它一起生活了20年了。IE过去一直这样做,而Firefox没有,因此有无数的bug。这类似于全局
事件
引用与传递给事件处理程序的参数的问题。@Pointy根据接受的答案,这似乎最初是IE的非标准行为,但现在已被取消“由HTML5标准化,其方法是记录和标准化浏览器作者对我们造成的每一个可怕的行为,使他们永远成为网络的一部分。”(