Javascript 如何解释(文档)0[]
我看到了这样一个代码片段:Javascript 如何解释(文档)0[],javascript,Javascript,我看到了这样一个代码片段: with(document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))] document.getElementsByTagName('head')[0] || document.body.appendChild(createElement(xxx)) 我不知道如何理解(document)0[]的这是无效的JavaScript语法,试着理解一下,语义非常不清
with(document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))]
document.getElementsByTagName('head')[0] || document.body.appendChild(createElement(xxx))
我不知道如何理解(document)0[]的
这是无效的JavaScript语法,试着理解一下,语义非常不清楚
我想作者的意思是这样的:
with(document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))]
document.getElementsByTagName('head')[0] || document.body.appendChild(createElement(xxx))
“如果文档中有任何
标记,请返回第一个。否则,请返回将createElement(xxx)
附加到正文中的结果。”如果没有完整的代码,很难回答此问题。但我会在这里做一些假设
我想说的第一件事是避免使用with()
语句。不建议在ECMAScript 5中使用,并且在严格模式下禁止使用。其中一个原因是你的片段——这段代码让很多人感到困惑,甚至是你
让我们重写一下,让它更容易理解:
with(document) {
0[(getElementsByTagName('head')[0] || body).appendChild(createElement(xxx))];
}
与
的工作原理您可以在这里阅读-,但基本上,它让我们能够直接使用表达式的所有属性和方法,我们将使用
发送到(在我们的例子中,它是一个文档
)
那么,如果没有和,这个代码片段会是什么样子呢
0[(document.getElementsByTagName('head')[0] || document.body).appendChild(document.createElement(xxx))];
我唯一没有的答案是——为什么要在括号内执行这段代码?我的假设如下:
此代码片段(document.getElementsByTagName('head')[0]| | document.body).appendChild(document.createElement(xxx))
将返回新创建元素的节点。但是如果我们将此代码放入0[]
,它将返回undefined
,因为没有这样的属性。同样,如果没有完整的图片,很难理解此代码片段的所有部分。(文档)0
在控制台中给出错误:/这应该是一个解析错误。你在哪里发现的?!我并不惊讶你不理解它-这是胡说八道。我不确定,但在编辑之前,代码前面有和。这是否意味着类似于typescript?“(document)0[(getElementsByTagName('head')[0]| | body.).appendChild(createElement('script')).src='Date()/36e5)];”这是源代码,运行良好;我知道可以改变范围;但是0如何解释是的,这段代码应该运行良好,编写正确。我不知道js中有什么“后台魔术”可以在这个代码片段中使用0[]
。对我来说,唯一合乎逻辑的解释是这个片段中的返回值。因此,在执行内部表达式之后,它将返回src,因此代码将如下所示:with(document)0[“http://..."];代码>。要处理此问题,JS引擎将执行新编号(0)
并搜索“http://...属性,并返回未定义的。因此,由于0[]
wrapper,此代码片段将返回undefined
,而不是http://...
谢谢您的回答;但我认为这没有意义,因为没有变量来保存返回值