在HTML的世界里,你可能会想当然地认为,既然`
![]()
`这样的标签可以用自闭合的方式书写(例如`

`),那么`script`标签是不是也能如法炮制,写成``?答案是,不能,至少不能按照你期望的那样工作。这背后涉及到HTML解析器如何理解和处理这些标签,以及`script`标签的特殊性。
首先,我们得明白,HTML标签的解析并不是完全对称的。虽然很多标签有一个开始标签和一个结束标签,但HTML5引入了一些灵活性,允许某些元素省略结束标签,比如`
![]()
`、`
`、`
`。这些被称为“自闭合”标签,或者更准确地说,是“空元素”。它们本身就代表着一个内容,不需要包围任何内容。
然而,`script`标签的情况有些不同。它本质上是一个容器标签,它的主要作用是引入外部的JavaScript代码(通过`src`属性)或者直接在标签内部编写JavaScript代码。当浏览器解析到一个`script`标签时,它会根据标签的内容来执行相应的操作。
当你写下``时,HTML解析器会将其看作一个开始标签`script`,然后紧跟着一个属性`src`,值为`jquery.js`,接着是一个斜杠`/`。这里的关键在于,那个斜杠`/`在HTML5的规范里,对于像`script`这样需要有内容的标签,它并不是一个表示“我自闭合了”的信号,而是会被解析器误解。
在HTML5规范的早期版本以及一些旧的浏览器实现中,解析器可能会将这个斜杠`/`和后面的空白字符(如果存在)一起,错误地当作是结束标签的一部分。这意味着,浏览器可能认为`script`标签在这里就结束了,而它本应该去加载`jquery.js`这个外部文件。更糟糕的是,它甚至可能尝试将斜杠`/`本身或者它后面的内容(如果有的话)当作是JavaScript代码来执行,这显然是行不通的,并且会引发错误。
可以想象一下,浏览器读到``,它看到了“script”,看到了“src”,然后是那个斜杠。如果它理解为“哦,这个script标签在这里就结束了,并且里面啥也没有”,那么它就不会去执行加载`jquery.js`这个动作。它会认为你写了一个空的script标签,然后继续往下解析。
更为标准的写法是``。这里,浏览器清楚地知道`script`标签的开始,它会看到`src`属性,然后它会寻找结束标签``。在遇到结束标签之前,它会根据`src`属性去加载指定的JavaScript文件。一旦文件加载完成,它就会执行其中的代码。
尽管HTML5在某些方面变得更加宽容,但对于`script`标签这样需要明确处理其内容(无论是外部文件还是内部代码)的标签,传统的开始标签和结束标签的配对方式是最稳健、最不容易引起混淆的。自闭合的写法,在这个特定场景下,会干扰浏览器对`script`标签意图的正确理解,导致脚本无法加载或执行。
所以,即便在今天,为了确保jQuery能够被正确地引入并执行,使用``这种明确的开始和结束标签的格式,才是最可靠的选择。它避免了解析器的误判,确保了浏览器能够按照预期的方式去处理你的JavaScript代码。