1. html+javascript 执行顺序问题
代码一般是从上而下加载的,但是执行的顺序可不一定是这样!
setInterval("funcTime()",1000);
这个函数就是说,当这行版代码读完一权秒钟之后再执行funcTime()为个函数;而funcTime()这个函数,在在之前就已经加载进来了,但是没有执行,也就是说,光加载进来不被调用的话,这个函数是不执行的。所以setInterval("funcTime()",1000);和funcTime()编写的顺序,一般是可以互换位置的。
而<body onload="funcTime();">的意思就是说当页面全部加载完成后,再执行funcTime()这个函数。也就是说,在没加载完成这个网页时,虽然加载到了<body onload="funcTime();">
这行代码,也不会执行funcTime()为个函数。假设在加载到<body onload="funcTime();">
这行代码后一个小时,整个页面才加载完的话,funcTime()只能在这一个小时之后,才会执行。
不知道这么说,说明没有!?
2. js中怎样操作代码执行的先后顺序
这次给大家带来JS中怎样操作代码执行的先后顺序,JS操作代码执行先后顺序的注意事项有哪些,下面就是实战案例,一起来看一下。
一、js--->单线程
??严格意义上来说,javascript没有多线程的概念,所有的程序都是单线程依次执行的。
??1、什么是单线程?
??通俗点说,就是代码在执行过程中,另一段代码想要执行就必须等当前代码执行完成后才可以进行。我们拿一段代码来解释一下吧
for(var i=1;i<=3;i++){
setTimeout(function(){
console.log(i); //输出:4,4,4
},0)
}
??我们来看一下上面的这段代码,既然延时器时间设置为0,那么应该执行一遍循环就应该立即打印出一个i,但是最终的打印结果为:4,4,4。之所以会出现上面的结果,正是因为js代码是单线程应用。
??在执行过程中,先遇到for循环,for循环先进入线程。当i=1时,循环走到setTimeOut后,此时的for循环还没有执行完成,setTimeOut就会被放入一个地方(线程池)等待执行。此时for循环继续执行,当i=2时,for循环仍没有执行完,这时的setTimeOut仍会被放在线程池中等待执行??依次类推,直到for循环转完3遍后,for循环执行完了,此时线程空闲了,在线程池中等待执行的setTimeOut依次执行打印i,而for循环执行完成后,i变成了4,所以打印出了三个4。
??2、如果想要改变上面的状况可以运用以下代码
//将var变为let
for(let i=1; i<=3; i++){
setTimeOut(function(){
console.log(i); //输出的结果为1,2,3
},0);
}
//用自执行函数进行包裹
for(var i=1; i<=3; i++){
!function(i){
setTimeOut(function(){
console.log(i); //输出的结果为1,2,3
},0);
}(i)
}
二、js中的函数作用域和代码的执行
??>>>函数作用域
我们先来了解一下以下几个概念:
??1、在js语言中,没有类似于c语言这样的块级作用域。
??2、js语言中的顶级作用域为window对象范围内,称为全局作用域,在全局作用域中声明的变量为全局变量。
??3、js函数范围内的变量只能在函数内部使用,函数外部无法使用,这样的变量为局部变量。
??4、js函数可以嵌套,多个函数的嵌套构成了作用域的层层嵌套,这称为js中的作用域链。
??5、js作用域链变量访问规则:
????(1)、当前作用域内存在要访问的变量时,则使用当前作用域中的变量。
??? (2)、当前作用域中不存在要访问的变量时,则会到上一层作用域中寻找,直到全局作用域。
??>>>执行顺序
??js代码执行分为两个部分:
??1、代码的检查装载阶段(预编译阶段),此阶段进行变量和函数的声明,但是不对变量进行赋值,变量的默认值为undefined。
??2、代码的执行阶段,此阶段对变量进行赋值和函数的声明。
看了上面的一些具体的概念,我们拿一段代码进行举例说明:
var a=1; //声明了一个全局变量
function func(){
console.log(a); //输出:undefined。打印a,而在func这个作用域中已经声明了a变量,按照js的执行顺序,此时的a并未被赋值。
var a=1;
console.log(a); //输出:1。
}
func();
??看上面的代码:第一个a输出undefined。原因:js作用域链的访问规则,当前作用域内存在要访问的变量a,所以使用当前作用域中的变量。再根据js代码的执行顺序,此时的a只是声明了而并未被赋值,默认为undefined,所以输出undefined。
??而第二个a,输出1,正是因为此时的a已经被声明且被赋值,所以a输出1。
相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!
推荐阅读:
vue.js搭建图书管理平台的技术解答
vue.js常用指令总结归纳
JS按钮禁用和启用使用详解
3. JS事件绑定的事件是按照顺序执行的吗
JS绑定的同步事件是按照绑定顺序执行的。W3C对此有相关规范,原文内容如下:
Events which are synchronous (sync events) are treated as if they are in a virtual queue in a first-in-first-out model, ordered by sequence of temporal occurrence with respect to other events, to changes in the DOM, and to user interaction. Each event in this virtual queue is delayed until the previous event has completed its propagation behavior, or been canceled.
简单的翻译一下:
同步事件被看做有一个虚拟的先进先出的队列,按照绑定的时间的顺序进行DOM操作或者用户交互。每一个虚拟队列中的事件都会一直等待直到他前面的那个事件传播(冒泡或捕获)结束或者被取消。
文档地址:https://www.w3.org/TR/DOM-Level-3-Events/#sync-async
4. js如何同时执行多个相同程序
js是顺序执行的,浏览器在执行到ajax的时候是不会等待ajax返回结果再继续执行的,所以你那个问题应该是ajax请求后台与js执行之间的一个延迟问题。你可以给执行ajax的js外面加上:
setTimeout(function(){调用ajax的js方法体}, 1000);
这样浏览器就会等待一秒,让数据返回之后(前提是1秒之内数据能成功返回)再继续执行下去。