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

Javascript |为什么它一开始会起两次作用

JavaScript是一种广泛应用于前端开发的编程语言,它的特点是灵活、动态和解释性。在浏览器中执行JavaScript代码时,有时会出现一开始就起两次作用的情况。下面是对这个问题的完善且全面的答案:

一开始会起两次作用的原因是因为浏览器在加载HTML页面时,会按照从上到下的顺序解析和执行代码。当浏览器遇到<script>标签时,会立即加载并执行其中的JavaScript代码。而如果JavaScript代码中有对DOM元素的操作,比如通过document.getElementById()获取元素,那么在代码执行时,浏览器可能还没有完全解析和构建DOM树,因此无法找到相应的元素。

为了解决这个问题,浏览器采取了一种策略,即在页面加载过程中,遇到<script>标签时会先执行一次代码,然后继续解析和构建DOM树,等到DOM树构建完成后再执行一次代码。这样就保证了JavaScript代码能够正确地获取到DOM元素。

这种策略的实际效果是,JavaScript代码会在页面加载过程中被执行两次。第一次执行时,可能会出现无法获取到DOM元素的情况,因此需要在代码中进行相应的判断和处理。而第二次执行时,DOM树已经构建完成,可以正常地操作DOM元素。

需要注意的是,这种行为是由浏览器自身决定的,不同的浏览器可能会有不同的实现方式和行为。因此,在编写JavaScript代码时,应该考虑到这种情况,并编写健壮的代码来处理可能出现的问题。

总结起来,JavaScript一开始会起两次作用的原因是浏览器为了解决代码执行时无法获取到DOM元素的问题而采取的策略。这种行为需要在代码中进行相应的处理,以确保代码能够正确地操作DOM元素。

推荐的腾讯云相关产品和产品介绍链接地址:

  • 云函数(Serverless):https://cloud.tencent.com/product/scf
  • 云开发(小程序开发):https://cloud.tencent.com/product/tcb
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能开发平台(AI Lab):https://cloud.tencent.com/product/ailab
  • 物联网开发平台(IoT Explorer):https://cloud.tencent.com/product/iothub
  • 移动推送服务(信鸽):https://cloud.tencent.com/product/tpns
  • 区块链服务(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯会议:https://cloud.tencent.com/product/tcmeeting
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript经典面试题之for循环click

闭包是JavaScript语言的一个难点,也是的特色,很多高级应用都要依靠来实现。...变量作用JavaScript变量作用域的特点在于,函数内部可以读取该函数外部的变量,但函数外部无法读取该函数内部定义的变量,但是我们可以通过变通的方式获得。...这就是Javascript语言特有的”链式作用域”结构(chain scope),子对象一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。...  }   var result=f1();   result(); // 999   nAdd();   result(); // 1000 在这段代码中,result实际上就是闭包f2函数,一共运行了两次...为什么这样呢?

75960

JavaScript 闭包详解

JavaScript闭包 文章目录 JavaScript闭包 一、为什么要闭包 二、让某些变量得以常驻内存 1.原理 2.Why 立即执行函数?...(至于为什么请看下文)....我想探讨一下为什么推荐用立即执行函数来配合闭包进行变量保存… 一开始我猜为了在闭包函数保存完需要的变量后父函数能被及时回收释放内存,才采用了匿名立即执行函数来作为闭包函数的父函数.因为立即执行函数自我回调执行完成后会被立即销毁回收...这个闭包函数的父函数函数每接收一个num就会创建新的一个函数作用域(见例3),作用域中传入i后,变量i的当前值作为实参赋值给上面的形参num,而在当前每个作用域的内部,又创建并返回了一个返回num的闭包函数...引擎先看到了你的”function”关键字,然后就开始以函数声明标准规范你后续的代码,最终JavaScript引擎发现你用一个小括号结束了你的函数,觉得这是错的.

40820

浏览器内核

Safari Webkit 从Safari推出之时的渲染引擎就是Webkit,一提到 webkit,首先想到的便是 chrome,可以说,chrome 将 Webkit内核 深入人心,殊不知,Webkit...下面是Chromium的架构图 普通JavaScript引擎(笨重) 作用javascript引擎帮助我们将js代码编译成CPU认识的指令集,最终被cpu执行。...随着技术的发展,对JavaScript性能的要求越来越高,V8引擎就是在此背景下产生的,产生的目的就是为了提高javascript执行的性能。...将javascript代码转换成AST V8引擎先将javascript代码转换成AST(抽象语法树),事实上所有的编程语言都会将源代码解析成抽象语法树(abstract syntax tree, AST...这是因为并不是所有的js代码一开始就会被执行,如果对所有的js代码都进行解析,影响网页运行效率。

73010

JavaScript到底是解释型语言还是编译型语言?

最开始的时候,JavaScript 的圣经 —— MDN 明确地说 JavaScript 是一个解释型语言(同时还说到了 JIT 及时编译,后文提及)。...但是下面几点仍然JavaScript 是否真的是一个解释型语言产生疑问: 如果 JS 是解释型语言那为什么会有变量提升(hoisting)?...在函数作用域内的任何变量的声明都会被提升到顶部并且值为undeinfed。 所以 JavaScript 引擎好像解释了同一个脚本文件两次?第一次完成所有的声明提升然后第二次才执行代码?...现代 JavaScript 引擎同样有 JIT。是的,它们有编译器。让我来为你解释一下为什么它们需要 JIT 以及 JIT 在 JavaScript 的执行中是如何工作的。.../ end - 用心分享 一成长 做有温度的攻城狮 每天记得对自己说:你是最棒的!

1.7K20

50道JavaScript详解面试题,你需要了解一下

这就是为什么更改仅影响函数范围内的参数的原因。 3、控制台输出是什么? 在这种情况下,由于我们两次定义了相同的变量,因此,会在控制台上引发错误。...用简单的话来说,嵌套的catch仅捕获其作用域及其以下范围内的故障,而不捕获嵌套范围之外的链中较高的错误。 22、控制台输出是什么,为什么?...32、在浏览器下一次重画显示内容之前,哪个函数执行指定的代码块? requestAnimationFrame()。 33、为什么在导入模块时使用别名?...35、JavaScript中的子程序是什么? 子例程是主例程中遇到的函数,然后将其保存到对象并存储以供以后使用。例如,执行范围(变量,参数等)与子例程一存储。...39、Object.freeze()的作用是什么? 防止添加新属性。 它可以防止更改对象的原型。 防止更改属性的值。 防止更改属性的可写性。

3.5K40

一些有意思的JavaScript代码片段

虽然我使用JavaScript的时间还不算长,也是遇到了一些有意思的场景,一开始百思不得其解,弄清楚之后又让我哭笑不得。现在就来跟大家一分享一下。...为什么操作复制的对象修改原来的对象呢?...但是如果上面的代码在严格模式中执行的话,情况又不一样了,由于严格模式不允许创建全局变量所以这段代码直接抛出异常。...它不是8而是undefined,这又是为什么? 这是因为JavaScript里面有个现象叫提升。提升是JavaScript中把变量声明移到当前作用域最顶部的一种行为。...这边我们把10作为参数传给函数,同样地delete在这里对原始类型也不起作用,所以照常打印出10。

57340

JavaScript中的执行上下文和堆栈

你可以阅读大量涉及作用域的在线资料,不过为了使事情更容易理解,让我们将术语“执行上下文”视为当前代码的运行环境或作用域。...为什么这样呢? 这段代码究竟是如何处理的? Execution Context Stack(执行上下文堆栈) 浏览器中的JavaScript解释器被实现为单个线程。...但是,在JavaScript解释器中,对执行上下文的每次调用都有两个阶段: 创建阶段 [调用函数时,但在执行任何代码之前]: 创建作用域链。 创建变量,函数和参数。 确定“this”的值。...Foo被声明两次为什么foo显示为`function`而不是`undefined`或`string`?...总结 希望到这里你已经能够很好地掌握了JavaScript解释器如何预处理你的代码。 理解执行上下文和堆栈可以让你了解背后的原因:为什么代码预处理后的值和你预期的不一样。

1.1K40

Angular 2:Web技术发展的必然选择

我们知道JavaScript 是一门单线程语言。最初开发这门语言的时候,目标只是用来编写简单的客户端脚本,但是随着时间的推移,的角色发生了很大的转变。...这就是为什么Angular 核心团队从一开始就决定在Web Component 的基础上构建并全面支持新标准的原因。...如果digest 循环涉及密集的运算,为什么不把移到WebWorker 中去?为什么不在WebWorker 内部执行digest循环,获取到发生变化的数据绑定,然后再把它们应用到DOM 上去呢?...如果在AngularJS 1.x 中处理这些问题,内部实现变得相当复杂。因为框架一开始压根就不是基于这一机制构建的。...而Angular 2 在启动设计之前WebWorker 已经获得了标准化,所以核心团队从一开始就已经把考虑在内了。

1.8K10

Javascript中你必须理解的执行上下文和调用栈

它可以帮助你更好的理解代码的执行过程,作用域,闭包等关键知识点。特别是闭包它是 JavaScript 中的一个难点,当你理解了执行上下文在回头看闭包时,应该会有豁然开朗的感觉。...这篇文章我们将深入了解 执行上下文,读完文章之后你应该可以清楚的了解到 JavaScript 解释器到底做了什么,为什么可以在一些函数和变量之前使用它,以及它们的值是如何确定的。...但是在 JavaScript 解释器中,每次调用执行上下文会有两个阶段: 创建阶段 创建作用域链 创建变量,函数,arguments列表。...foo 被声明了两次为什么 foo 显示的是 function而不是 undefined或者 string?...为什么 bar 是 undefined? bar 实际上是一个变量只不过的值是函数,而变量在创建阶段的值为 undefined。

44510

Javascript中你必须理解的执行上下文和调用栈

它可以帮助你更好的理解代码的执行过程,作用域,闭包等关键知识点。特别是闭包它是 JavaScript 中的一个难点,当你理解了执行上下文在回头看闭包时,应该会有豁然开朗的感觉。...这篇文章我们将深入了解 执行上下文,读完文章之后你应该可以清楚的了解到 JavaScript 解释器到底做了什么,为什么可以在一些函数和变量之前使用它,以及它们的值是如何确定的。...但是在 JavaScript 解释器中,每次调用执行上下文会有两个阶段: 创建阶段 创建作用域链 创建变量,函数,```arguments```列表。...foo 被声明了两次为什么 foo 显示的是 function 而不是 undefined 或者 string?...为什么 bar 是 undefined? bar 实际上是一个变量只不过的值是函数,而变量在创建阶段的值为 undefined。

54630

【译】JS的执行上下文和环境栈是什么?

为什么这样?这段代码究竟是如何评估的? 环境栈 浏览器中的JavaScript解释器是单线程实现的。这意味着在浏览器中一次只能发生一件事情,其它动作或事件在所谓的执行栈中排队。...一旦上下文执行完毕,它就会弹出栈并且将控制权返回下面的上下文,直到再次到达全局上下文。...但是,在JavaScript的解释器中,执行上下文的调用都有两个阶段: 创建阶段【调用函数时,但是在执行里面的代码之前】: 创建作用域链 创建变量,函数和参数 确定this的值 激活/代码执行阶段: 分配值...foo前访问?...Foo被声明了两次为什么foo显示为函数而不是undefined或string呢?

75120

面试怼回去!我不用TypeScript的7个很好的理由🥱

如果你花时间写定义,然后花时间写代码来确保这些定义在运行时得到维护,那为什么一开始就要有这些定义呢? 太乱了 另一个悖论是:语言本应该为代码库带来清晰和可读性,但它却使代码库变得模糊了。...动态类型化在JavaScript中从来都不是问题,但是其他很多毛病,比如 NaN === NaN 是false的,分号是可选的还是不可选的,一个换行符把一个对象定义改成了作用域,语法糖代替OOP,这些确实是问题...限制了你使用JavaScript所能做的事情,掩盖了强大的一面,同时提供了一种虚假的安心感。...为什么突然间他们使用TypeScript就是一个好例子? 但是具有更多功能…… 现在不一样了。的确,2012年TS刚推出的时候,它有类等功能,在JS中还是没有的。...但是JS从那时已经有了长足的进步,现在TS也在努力的追赶。如果JS有什么缺失,有一个babel插件可以做到。 感谢你的阅读,希望你喜欢这篇文章!

66241

如何创建成功的FMEA计划

A部门进行了两次故障模式和影响分析(FMEA),结果非常成功。该公司希望在整个企业范围内扩大该技术的使用。如何才能做到最好?本文将这个扩展过程分为两个阶段:一、谁来做FMEA?...这就是为什么每家公司都必须为自己定义标准。例如,在一些企业中,质量经理显然对FMEA负有全面责任。然而,其他人发现,将这一职责分配给工程经理更有效。...从那时,部门经理可能负责其部门的设计和流程,工程师可能负责其设计和流程的FMEA。然而,其他员工不仅要在FMEA的推出中发挥作用,还要在生成FMEA并完成其建议中发挥作用。...但为一个问题流程执行一个高质量的FMEA可能很累人。会议可能陷入关于严重性排名的辩论中。记录的流程可能与实际流程不同。当将流程推广到整个组织时,这些问题可能会成倍增加。...遵循本文中描述的解决方案,不仅使单个FMEA成功,而且使整个组织的FMEA从一开始就成功。确保所有当前的故障信息在会议和其他FMEA计划期间容易获得。

40220

一文看懂Javascript的this关键字

教科书般的解释,字都认识,怎么连在一还是不知道啥意思呢? 1 this的值究竟是什么呢? 函数的不同场合,this有不同值。 总的来说,this就是函数运行时所在的环境对象。...可以写class test,但本质上new test()的时候,还是test构造函数,差不多,class主要是向java之类的语言抄的,可以直接当java的类用,但本质上test还是个构造函数,因为js一开始就没有...1.4 apply 调用 apply()是函数的一个方法,作用是改变函数的调用对象。的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这第一个参数。...为什么这样?函数的运行环境到底是谁决定的?为什么obj.foo()就是在obj环境执行,而一旦var foo = obj.foo,foo()就变成全局环境执行了?...参考 Javascript 的 this 用法 JavaScript 的 this 原理

44700

一文看懂Javascript的this关键字

教科书般的解释,字都认识,怎么连在一还是不知道啥意思呢? 1 this的值究竟是什么呢? 函数的不同场合,this有不同值。 总的来说,this就是函数运行时所在的环境对象。...可以写class test,但本质上new test()的时候,还是test构造函数,差不多,class主要是向java之类的语言抄的,可以直接当java的类用,但本质上test还是个构造函数,因为js一开始就没有...1.4 apply 调用 apply()是函数的一个方法,作用是改变函数的调用对象。的第一个参数就表示改变后的调用这个函数的对象。因此,这时this指的就是这第一个参数。 ?...为什么这样?函数的运行环境到底是谁决定的?为什么obj.foo()就是在obj环境执行,而一旦var foo = obj.foo,foo()就变成全局环境执行了?...参考 Javascript 的 this 用法 JavaScript 的 this 原理

31140

快速上手 React Hook

但现在我们为它们引入了使用 React state 的能力,所以我们更喜欢叫”函数组件”。 Hook 在 class 内部是不起作用的。但你可以使用它们来取代 class 。...这就是为什么在 React class 中,我们把副作用操作放到 componentDidMount 和 componentDidUpdate 函数中。...我们不需要特殊的 API 来读取 —— 已经保存在函数作用域中。...这就是为什么 React 会在执行当前 effect 之前对上一个 effect 进行清除。 3.3 性能优化 在某些情况下,每次渲染后都执行清理或者执行 effect 可能导致性能问题。...这是因为创建的是一个普通 Javascript 对象。而 useRef() 和自建一个 {current: ...} 对象的唯一区别是,useRef 会在每次渲染时返回同一个 ref 对象。

4.9K20

「 不懂就问 」esbuild 为什么这么快?

API for JavaScript and Go TypeScript and JSX syntax Source maps Minification Plugins 现在很多工具都内置了,比如我们熟知的...今天我们就来探索一下: 为什么 esbuild 这么快?...可以从一开始就牢记性能,可以确保所有内容都使用一致的数据结构来避免昂贵的转换,并且可以在必要时进行广泛的体系结构更改。缺点当然是多了很多工作。...例如,esbuild 仅触及整个JavaScript AST 3次: 进行词法分析,解析,作用域设置和声明符号的过程 绑定符号,最小化语法。...当 AST 数据在CPU缓存中仍然处于活跃状态时,最大化AST数据的重用。 其他打包器在单独的过程中执行这些步骤,而不是将它们交织在一

71940

「 不懂就问 」esbuild 为什么这么快?

API for JavaScript and Go TypeScript and JSX syntax Source maps Minification Plugins 现在很多工具都内置了,比如我们熟知的...今天我们就来探索一下: 为什么 esbuild 这么快下文的主要内容: 几组性能数据对比 为什么 esbuild 这么快 esbuild upcoming roadmap esbuild 在 vite...可以从一开始就牢记性能,可以确保所有内容都使用一致的数据结构来避免昂贵的转换,并且可以在必要时进行广泛的体系结构更改。缺点当然是多了很多工作。...例如,esbuild 仅触及整个JavaScript AST 3次: 进行词法分析,解析,作用域设置和声明符号的过程 绑定符号,最小化语法。...当 AST 数据在CPU缓存中仍然处于活跃状态时,最大化AST数据的重用。 其他打包器在单独的过程中执行这些步骤,而不是将它们交织在一

1.2K10

javasciprt性能优化

本文主要是在我读《高性能Javascript》之后,想要记录下一些有用的优化方案,并且就我本身的一些经验,来大家一分享下, Javascript的加载与执行 大家都知道,浏览器在解析DOM树的时候,当解析到...使用defer这种写法时,虽然浏览器解析到该标签的时候,也会下载对应的js文件,不过并不会马上执行,而是等到DOM解析完后(DomContentLoader之前)才会执行这些js文件。...javascript作用域 当一个函数执行的时候,会生成一个执行上下文,这个执行上下文定义了函数执行时的环境。当函数执行完毕后,这个执行上下文就会被销毁。...因此,多次调用同一个函数导致创建多个执行上下文。每隔执行上下文都有自己的作用域链。相信大家应该早就知道了作用域这个东西,对于一个函数而言,其第一个作用域就是函数内部的变量。...那么,的优点在哪里呢?假设你有一个列表,里面每一个列表项都需要绑定相同的事件,而这个列表可能频繁的插入和删除。

71040
领券