首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么代码在<script>标签中有效,而在外部.js文件中无效?🤨

在<script>标签中有效,而在外部.js文件中无效的原因是因为<script>标签中的代码会在浏览器解析HTML文档时立即执行,而外部.js文件需要通过浏览器的网络请求加载并执行。

当浏览器解析HTML文档时,遇到<script>标签会立即执行其中的代码。这意味着在<script>标签中定义的函数、变量等内容可以立即被其他<script>标签或HTML中的其他代码所使用。这种方式适用于一些简单的脚本,可以直接嵌入到HTML文档中,方便管理和调用。

而外部.js文件需要通过网络请求加载并执行。当浏览器解析到外部.js文件的引用时,会发送一个HTTP请求去获取该文件,并在获取到文件后执行其中的代码。由于网络请求的延迟和加载时间,外部.js文件的代码执行会有一定的延迟。因此,在外部.js文件中定义的函数、变量等内容在加载完成之前是无法被其他代码所使用的。

此外,还需要确保外部.js文件的引用路径正确无误,否则浏览器无法正确加载该文件,导致代码无效。

总结起来,<script>标签中的代码在HTML解析过程中立即执行,而外部.js文件需要通过网络请求加载并执行,因此在外部.js文件中定义的代码在加载完成之前是无效的。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

天了噜,为什么外链css要放在头部,js要放在尾部?

我们最开始学前端的时候都会看到教程处理外部css,js的时候会将css放在headerjs放在body的最后。为什么要这样子处理,今天参考一些资料好好分析下。...这两个属性只是script标签在header标签中使用的,如果你把它放在body后面是无效的。...script 的这两个属性主要用于其js文件没有操作DOM的情况,这时候就可以将该js脚本设置为异步加载,通过async或defer来标记代码。...async和defer的区别: 0、async和defer都仅对外部脚本有效,对于内置而不是连接外部脚本的script标签,以及动态生成的script标签不起作用。...对于async标记,浏览器的解析过程是这样的: 浏览器开始解析HTML网页 解析过程,发现带有async属性的script标签 浏览器继续往下解析HTML网页,同时并行下载script标签外部脚本

2.6K20
  • 你不知道的 script 标签的 defer 与 async 属性

    前言 面试的时候,经常会遇到一道经典的面试题: 如何优化网页加载速度? 常规的回答总会有一条: 把 css 文件放在页面顶部,把 js 文件放在页面底部。...那么,为什么要把 js 文件放在页面的最底部呢? 我们先来看下这段代码: <!... SPA 的应用,可以考虑把所有的 script 标签加上 defer 属性,并且放到 body 的最后面。...脚本执行过程,一定可以获取到 HTML 已有的元素。 defer 属性对模块脚本无效。 适用于:所有外部脚本(通过 src 引用的 script)。...一图胜千言 最后,用一张图概括一下这两个属性的加载模式吧: defer 和 async 的加载模式 思考题 为什么浏览器解析到普通的 script 标签时,必须先执行他?

    85210

    从一道CTF学习Service Worker的利用

    变量覆盖和DOM XSS 仔细查看login处的js代码,可以发现一处dom xss: 首先,注意到 jsonp 函数会创建 script 标签,并使用 https://auth.hardxss.xhlj.wetolink.com...通过link标签引入外部js if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw-test/sw.js.../js/sw.js", {scope: "/assets/css/"} 有效:"/assets/js/sw.js", {scope: "/assets/js/"} 有效:"/assets/js/sw.js...从而引入外部JS // sw.js(SW恶意脚本) onfetch=e=>{//劫持fetch事件,即浏览器子域下的每一次访问都会触发 body = 'alert(document.domain...是SW脚本,2.js,我们劫持了fetch事件,并将请求传给我们的服务器,从而在管理员登陆时劫持并窃取管理员密码,达到利用目的。

    1.2K40

    Hexo异步加载方案

    写在最前 博客魔改过程,不可避免的会引入大量的第三方脚本(js),而基于页面读取js的加载顺序,每当浏览器加载html的过程遇到js代码片段这样的标签时,浏览器会暂停继续构建...至于外部脚本 这样的写法,更是要先下载脚本,然后再执行,之后才能继续处理剩余的页面。 无形,多出了一大把的加载时间。...目前有效手段有两种,一种是通过定义一个无效media,使得该CSS引入优先级最低,再用onload="this.media='all'"页面加载完成后纠正media,并加载CSS。...defer并无意义,是个无效media(只是方便理解才这么写),目的是让浏览器认为这个CSS文件优先级非常低,从而在不阻塞的情况下进行加载。...(如果是手动添加整合的话,只能用注释分割,显然很不利于后续查找修改),而在每次提交时,运行hexo g的过程中就会将所有CSS文件都整合到index.css,可以主题配置文件的CDN配置项里给index.css

    1.7K20

    web前端开发初学者十问集锦(3)

    3.CSS样式标签在html文件中放置的位置?...推荐统一使用外部样式表。但是使用内部样式表的时候,style标签script标签一样,可以放置html文件的anywhere,任何地方。...实测,Chrome中有效果,IE9以及Fire Fox有效果。 8.js(JavaScript)单引号和双引号有什么区别? 一个Web大神告诉我说没什么区别,我实验了,还没发现有什么区别?...至于说为什么不执行setTimeout,是因为js的工作机制是:当线程没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等js空闲才会执行,但死循环是永远不会空闲的...简单的来说就是定时器时异步加载的,而js是单线程的,声明一个定时器之后,这个定时器会暂时保存在任务队列,当js的同步代码加载完毕之后再执行任务队列异步的定时器。

    1.6K20

    Javascript文件加载 ——LABjs和RequireJS

    传统上,加载Javascript文件都是使用标签。...由于浏览器按照在网页中出现的顺序,读取Javascript文件,然后立即运行,导致多个文件互相依赖的情况下,依赖性最小的文件必须放在最前面,依赖性最大的文件必须放在最后面,否则代码会报错...浏览器采用”同步模式”加载标签,也就是说,页面会”堵塞”(blocking),等待javascript文件加载完成,然后再运行后面的HTML代码。...这样不会造成页面堵塞,但会造成另外一个问题:这样加载的Javascript文件,不在原始的DOM结构之中,因此DOM-ready(DOMContentLoaded)事件和window.onload事件中指定的回调函数对它无效...外部函数库LABjs和RequireJS,可以帮助我们更有效地管理Javascript加载。 下面根据ScriptJunkie的文章,举一个最简单的例子,来说明这两个函数库的基本用法。

    1K20

    Javascript文件加载:LABjs和RequireJS

    由于浏览器按照在网页中出现的顺序,读取Javascript文件,然后立即运行,导致多个文件互相依赖的情况下,依赖性最小的文件必须放在最前面,依赖性最大的文件必须放在最后面,否则代码会报错...浏览器采用"同步模式"加载标签,也就是说,页面会"堵塞"(blocking),等待javascript文件加载完成,然后再运行后面的HTML代码。...这样不会造成页面堵塞,但会造成另外一个问题:这样加载的Javascript文件,不在原始的DOM结构之中,因此DOM-ready(DOMContentLoaded)事件和window.onload事件中指定的回调函数对它无效...外部函数库LABjs和RequireJS,可以帮助我们更有效地管理Javascript加载。 下面根据ScriptJunkie的文章,举一个最简单的例子,来说明这两个函数库的基本用法。...> 上面这段代码,将依次加载4个javascript文件script1.jsscript2-a.jsscript2-b.jsscript3.js

    1.4K40

    面试官:DTD 有什么作用?

    单纯的HTML代码是不带任何样式的只是用来标记这一段是标题、这一块是代码、那一个是要强调的内容等等,但是为什么我们只写HTML浏览器不同的标签也是有不同的样式呢?...1.标签语义化有助于构架良好的HTML结构,有利于搜索引擎的建立索引、有助于爬虫抓取更多的有效信息.简单来说,试想在H1标签匹配到的关键词和在div匹配到的关键词搜索引擎会吧那个结果放在前面。... 与后续元素渲染异步执行,乱序执行,若js文件之间存在依赖关系,容易产生错误, 只适用于完全没有依赖的文件,文档解析过程异步下载,下载完成之后立即执行。 最佳的解决方案 外部引用文件放在之前执行 放在与的区别?...为什么通常推荐将 CSS 放置 之间,而将 JS 放置 之前?你知道有哪些例外吗?

    1K10

    【漏洞预警】Apache Solr远程代码执行漏洞 (CVE-2019-0193)处置手册及技术分析

    攻击者可利用dataConfig参数构造恶意请求,实现远程代码执行,请相关用户尽快升级Solr至安全版本,以确保对此漏洞的有效防护。 ?...每个core都有对应的配置文件,需要修改每个core的配置。 经测试,官方给出防护方案置dataConfig参数为空字符串无效,用户需参考上述方案对此漏洞进行防护。...随后loadDataConfig通过readFromXml方法解析提交的配置数据的各个标签,比如document,script,function,dataSource等,传入的script自定义脚本即在此处被存入...Solr默认的js引擎是Nashorn,Nashorn是Java 8用于取代Rhino(Java 6,Java 7)的JavaScript引擎,js可以通过Java.type引用Java类,就像...整个漏洞就是因为可以通过标签指定ScriptTransformer,而在这个标签内可以导入任意的java类,Solr也并没有对标签内容做限制,导致可以执行任意代码。 ?

    1.1K10

    深度解读 Vite 的依赖扫描?

    ,将裸依赖保存到 deps 对象,设置为 external 其他 JS 无关的模块 less文件 解析过程,设置为 external JS 模块 ....id=0 磁盘是不存在的,需要借助打包工具(如 esbuild),在编译过程生成。 为什么需要虚拟模块?...因为一个 html 类型文件,允许有多个 script 标签,多个内联的 script 标签,其内容无法处理成一个 JS 文件 (因为可能会有命名冲突等原因) 既然无法将多个内联 script,就只能将它们分散成多个虚拟模块...,将裸依赖保存到 deps 对象,设置为 external 其他 JS 无关的模块 less文件 解析过程,设置为 external JS 模块 ....contents: js } } ) 加载阶段的主要做有以下流程: • 读取文件源码 • 正则匹配出所有的 script 标签,并对每个 script 标签的内容进行处理 • 外部

    91930

    深度解读 Vite 的依赖扫描?

    图片由于依赖扫描过程,只关注引入的 JS 模块,因此可以直接丢弃掉其他不需要的内容,直接取其中 JS html 类型文件(包括 vue)的转换,有两种情况:每个外部 script,会直接转换为 import...id=0 磁盘是不存在的,需要借助打包工具(如 esbuild),在编译过程生成。为什么需要虚拟模块?...因为一个 html 类型文件,允许有多个 script 标签,多个内联的 script 标签,其内容无法处理成一个 JS 文件 (因为可能会有命名冲突等原因)既然无法将多个内联 script,就只能将它们分散成多个虚拟模块...例如 vue,会解析到实际 node_modules 的 vue 的入口 js 文件加载:根据解析的路径,读取文件的内容图片插件可以定制化解析和加载的过程,下面是一些插件示例代码:const plugin...contents: js } })加载阶段的主要做有以下流程:读取文件源码正则匹配出所有的 script 标签,并对每个 script 标签的内容进行处理外部 script,改为用

    1.3K20

    高性能的JavaScript--加载和执行

    不论实际的JavaScript代码是内联的还是包含在一个不相干的外部文件页面下载和解析过程必须停下,等待脚本完成这些处理,然后才能继续,也是页面生命周期必不可少的部分,因为脚本可能在运行过程修改页面内容...传统上, 标签用于加载外部JavaScript 文件。部分除此类代码外,还包含 标签用于加载外部css文件和其他页面中间件。...每个〈script标签阻塞了页面解析过程,直到完整的下载并运行了外部JavaScript代码之后,页面才能继续进行。浏览器没有遇到〈body〉标签之前,不会渲染页面的任何部分。...这个规则对内联脚本和外部脚本同样适用。每当页面解析碰到一个标签时,紧接着有一段时间用于代码执行。最小化这些延迟时间可以改善页面的整体性能。...由于代码返回标签之外(换句话说不受标签约束),它下载后不会自动执行,这使得您可以推迟执行,直到一切都准备好了。

    77220

    JavaScript高级程序设计(第4版)- HTML的JavaScript

    # 元素 # 属性 async:(异步执行脚本)可选。立即下载脚本,但不阻止其他页面动作。只对外部文件有效。 crossorigin: 可选。默认不使用。...只对外部文件有效。 integrity: 可选。允许比对加密签名以验证子资源完整性。用于CDN不会提供恶意内容。 src: 可选。外部代码文件。 type: 可选。...ES6 模块,此时代码可出现 import 和 export 关键字 # 使用方式 网页嵌入 JS 代码 代码从上到下解释 代码计算完成之前,页面其余内容不会被加载或显示 使用行内代码时,代码不能出现字符串... 包含外部 JS 文件 src 属性中指定 URL 指向 JS 代码文件 下载和执行都会阻塞页面 使用 src 属性的标签内的代码会被忽略 可以包含来自外部域的 JS 文件(JSONP...gibberish.js'; script.async = false; document.head.appendChild(script); 以上方式对于浏览器预加载器不可见,会影响其资源获取队列的优先级

    51350

    async 和 defer 的区别

    HTML 的 元素定义了6个属性: async:可选,表示立即下载脚本,但不应该妨碍页面其它的操作,比如下载其它资源或者等待加载其它脚本,只对外部脚本文件有效。...charset:可选,src 属性指定的代码的字符集。多数浏览器会忽略它的值。 defer:可选,表示脚本可以延迟到文档完全被解析和显示后再执行。只对外部脚本有效。 language:已废弃。...src:可选,表示要执行代码外部文件。src 可以包含来自外部域的文件。 type:可选,可以看成 language 的替代属性。...要注意的是,带有 src 的 元素不应该再包含额外的代码,如果包含了嵌入的代码,则只会下载外部文件,嵌入的代码不会执行。...标签的位置 按照惯例,所有的 都应该放入 ,但是这就意味着必须要等所有的 JavaScript 代码下载解析和执行完毕后才能开始呈现页面内容(浏览器遇到 body 标签

    5.1K60

    桌面端前端性能优化策略

    、JavaScript、CSS 及 HTML 代码文件进行压缩优化 使用 gzip 等方式压缩传输文件 将 CSS 或 JavaScript 放到外部文件,避免使用 style 或 script...标签直接引入 HTML 文件引用外部资源可以有效利用浏览器的静态资源缓存 避免页面中空的 href 和 src 当 link 标签的 href 属性为空,或 script、img、iframe 标签的...src 属性为空时,浏览器渲染的过程仍会将 href 属性或 src 属性的空内容进行加载,直至加载失败,这样就阻塞了页面其他资源的下载进程,而且最终加载到的内容是无效的,因此要尽量避免 //...HTTP 请求数,加快资源下载速度 例如同一个域名 CDN 服务器上的 a.js,b.js,c.js 就可以按如下方式一个请求中下载: <script src="//cdn.domain.com/path...,此时可能会使页面的其他操作产生卡顿,因此要尽量减少页面中直接进行图片缩放 减少 DOM 元素数量和深度 HTML 中标签元素越多,标签的层级越深,浏览器解析 DOM 并绘制到浏览器中所花的时间就越长

    2K20
    领券