js执行顺序——学习笔记

摘要:
Js放置也是最后的手段,但通常我们的应用程序比较复杂,包括逻辑操作和dom操作。我们可能希望更早地执行逻辑操作。Js由单个线程同步执行。一旦发生错误,它将退出并中断执行。当js运行时,它将首先全局扫描var和function声明的对象。从上面的代码中,我们可以看到实际的执行顺序如下:var将被提前扫描,vara的声明部分将是;提取到前面执行,a=1;指定的零件仍在原始位置执行。

  我们知道有个全局的 window对象,js的一切皆window上的属性和方法。window上有个window.document属性,记录了整个html的dom树,document是顶层。

js执行顺序——学习笔记第1张

  body 和 head 都是 doc上的一个属性。

js执行顺序——学习笔记第2张

js执行顺序——学习笔记第3张

  上图中,head里面的打印结果是null,因为document是按照和我们阅读文字一样的方式按顺序加载的,并且,当加载到一个script标签时,会执行其中的代码,而此时body部分还没有加载,所以为null。

js执行顺序——学习笔记第4张

  所以,如果js代码在doc加载之前要选择或操作dom时就要写在 onload的事件回调中,如果不是操作dom,比如做个运算,获取请求接口数据,就不用关心onload没有。js放最后也是个办法,但一般我们应用都比较复杂,既有逻辑运算,也有操作dom,我们可能希望在更早的时候就执行逻辑运算的部分。所以还是想放到head去。

  js 是单线程同步执行的,一旦遇到报错就会退出,中断执行。

js执行顺序——学习笔记第5张

  故上面的代码会报错,停在第10行。

  那如果用函数把第10行包起来呢?

js执行顺序——学习笔记第6张

  当然,done还是不会打印,即便是一个函数,在调用这个函数时,会按顺序执行函数中的代码,遇到错误一样退出。这些都叫同步执行,所谓同步,就是指,按从上至下的顺序执行,一旦遇到错误就会退出程序,后面的代码将不会运行。

  当执行到 test()时,会执行函数里的代码,遇到错误就退出了,所以done不会执行打印出来。

js执行顺序——学习笔记第7张

  js 在运行时,会先全局扫描 var  和 function 声明的对象。

js执行顺序——学习笔记第8张

  上面的代码结果会是什么呢?(in  前面是字符串,后面是对象结构。用来判断一个对象上是否有前面的键值(属性))

  结果是undefined。解释一下,因为js 先全局扫面了 var,事先var了一个a,这样window上就有一个a为undefined了,

  if (!("a" in window))
  那么这个条件判断的时候,window上就是有一个a的,而且为undefined,既然有a了,那也就不会执行if里的语句了。所以a不会被赋值。上面的代码拆开来看,真正的执行顺序如下:

js执行顺序——学习笔记第9张

  var 会事先扫描,将声明的部分 var a; 提取到最前面执行,a = 1; 而赋值的部分依然在原来的位置执行。

  下面换一个方式。

js执行顺序——学习笔记第10张

效果如下:

js执行顺序——学习笔记第11张

最后,感谢大神CX的讲解。

免责声明:文章转载自《js执行顺序——学习笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决Windows对JDK默认版本切换问题pywinauto客户端自动化---自动打开PC端程序下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

webpack3 + vue 添加 serviceWorker

新的vue脚手架已经可以自带pwa了,本文主要针对旧版的webpack。 先装三个插件: $npm i register-service-worker sw-precache-webpack-plugin webpack-pwa-manifest --save-dev 因为pwa主要用于生产,我们来动手改造 build/webpack.prod.conf....

Gulp解决发布线上文件(CSS和JS)缓存问题

Gulp解决发布线上文件(CSS和JS)缓存问题     本文的缘由:目前经常线上发布文件后要不断的刷新页面及过很长时间,页面上的CSS和JS文件才能生效,特别对于目前做微信商城的时候,微信内置的浏览器缓存非常的严重,之前我们经常是在文件后面加上时间戳的方式来解决线上发布后的缓存问题,但是在微信浏览器内并不生效;因此我们需要改变文件名的方式来解决缓存的问题...

前端用js写一个函数输出当前时间,格式为yyyy-mm-dd hh:mm:ss

需求描述:写一个函数输出当前时间,格式为yyyy-mm-ddhh:mm:ss 实现思路: 方法一:首先获取当天时间,然后调用toLocaleString方法,将当天时间转换为字符串。再用replace方法将其替换成想要的格式。 方法二:首先获取当前时间,然后使用getFullYear、getMonth、getDate、getHours、getMinu...

js异步处理

js处理异步的几种方式 Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务。如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推)。 这种模式的好处是实现起来比较简单,执行环境相对单纯;坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行。常见的浏览器无响应(...

js 里面的 function 与 Function

function 是 js 的标识符 Function 是 js 里面的一个 构造函数 1、new function 与 new Function 的区别   new 运算符在 js 里面是 创建一个自定义的对象的实例 或者是 一个具有构造函数的本地对象的实例。     语法:new constructor [ ( [ arguments ] ) ]   ...

总结前端面试过程中最容易出现的问题

前言 之前在兴安得力的时候,我也出过前端的面试题。那么前端人员在外面面试的时候,一般技术人员都会考察我们那些地方呢?我在这里不妨总结一下!(PS:有点小邪恶,这个公开之后,对于面试者来说是方便了。但是,假如你是公司技术人员,是面试官,您不妨修改一下题目,变通一下!) javascript常见题目 一、您对js的原型是如何理解的?您对js的继承是如何理解的?...