JavaScript执行顺序

NC65增加自定义参照并且参照数据要根据选择的财务组织过滤 1、首先定义一个参照类 package nc.pub.jzcm.ref; import nc.ui.bd.ref.AbstractRefModel; import nc.ui.bd.ref.IRefDocEdit; import nc.ui.bd.ref.IRefMaintenanceHandler; public class PMPrPayDefaultRefModel extends AbstractRefModel { public PMPrPayDefaultRefModel(){ ... 阅读详情

1.6  JavaScript执行顺序

上一节是从JavaScript引擎的解析机制来探索JavaScript的工作原理,下面我们以更形象的示例来说明JavaScript代码在页面中的执行顺序。如果说,JavaScript引擎的工作机制比较深奥是因为它属于底层行为,那么JavaScript代码执行顺序就比较形象了,因为我们可以直观感觉到这种执行顺序,当然 JavaScript代码的执行顺序是比较复杂的,所以在深入JavaScript语言之前也有必要对其进行剖析。

1.6.1  按HTML文档流顺序执行JavaScript代码

首先,读者应该清楚,HTML文档在浏览器中的解析过程是这样的:浏览器是按着文档流从上到下逐步解析页面结构和信息的。JavaScript代码作为嵌入的脚本应该也算做HTML文档的组成部分,所以JavaScript代码在装载时的执行顺序也是根据脚本标签<script>的出现顺序来确定的。例如,浏览下面文档页面,你会看到代码是从上到下逐步被解析的。

<script>

alert("顶部脚本");

</script>

<html><head>

<script>

alert("头部脚本");

</script>

<title></title>

</head>

<body>

<script>

alert("页面脚本");

</script>

</body></html>

<script>

alert("底部脚本");

</script>

如果通过脚本标签<script>的src属性导入外部JavaScript文件脚本,那么它也将按照其语句出现的顺序来执行,而且执行过程是文档装载的一部分。不会因为是外部JavaScript文件而延期执行。例如,把上面文档中的头部和主体区域的脚本移到外部JavaScript文件中,然后通过 src属性导入。继续预览页面文档,你会看到相同的执行顺序。

<script>

alert("顶部脚本");

</script>

<html>

<head>

<script src="head.js"></script>

<title></title>

</head>

<body>

<script src="body.js"></script>

</body>

</html>

<script>

alert("底部脚本");

</script>

1.6.2  预编译与执行顺序的关系

当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理。所以,就会出现当JavaScript解释器执行下面脚本时不会报错:

alert(a);                            // 返回值undefined

var a =1;

alert(a);                            // 返回值1

由于变量声明是在预编译期被处理的,所以在执行期间对于所有代码来说,都是可见的。但是,你也会看到,执行上面代码,提示的值是undefined,而不是1。这是因为,变量初始化过程发生在执行期,而不是预编译期。在执行期,JavaScript解释器是按着代码先后顺序进行解析的,如果在前面代码行中没有为变量赋值,则JavaScript解释器会使用默认值undefined。由于在第二行中为变量a赋值了,所以在第三行代码中会提示变量a的值为1,而不是undefined。

同理,下面示例在函数声明前调用函数也是合法的,并能够被正确解析,所以返回值为1。

f();                                 // 调用函数,返回值1

function f(){

    alert(1);

}

但是,如果按下面方式定义函数,则JavaScript解释器会提示语法错误。

f();                                 // 调用函数,返回语法错误

var f = function(){

    alert(1);

}

这是因为,上面示例中定义的函数仅作为值赋值给变量f,所以在预编译期,JavaScript解释器只能够为声明变量f进行处理,而对于变量f的值,只能等到执行期时按顺序进行赋值,自然就会出现语法错误,提示找不到对象f。

虽然变量和函数声明可以在文档任意位置,但是良好的习惯应该是在所有JavaScript代码之前声明全局变量和函数,并对变量进行初始化赋值。在函数内部也是先声明变量,然后再引用。

1.6.3  按块执行JavaScript代码

所谓代码块就是使用<script>标签分隔的代码段。例如,下面两个<script>标签分别代表两个JavaScript代码块。

<script>

// JavaScript代码块1

var a =1;

</script>

<script>

// JavaScript代码块2

function f(){

    alert(1);

}

</script>

JavaScript解释器在执行脚本时,是按块来执行的。通俗地说,就是浏览器在解析HTML文档流时,如果遇到一个<script>标签,则JavaScript解释器会等到这个代码块都加载完后,先对代码块进行预编译,然后再执行。执行完毕后,浏览器会继续解析下面的HTML文档流,同时JavaScript解释器也准备好处理下一个代码块。

由于JavaScript是按块执行的,所以如果在一个JavaScript块中调用后面块中声明的变量或函数就会提示语法错误。例如,当JavaScript解释器执行下面代码时就会提示语法错误,显示变量a未定义,对象f找不到。

<script>

// JavaScript代码块1

alert(a);

f();

</script>

<script>

// JavaScript代码块2

var a =1;

function f(){

    alert(1);

}

</script>

虽然说,JavaScript是按块执行的,但是不同块都属于同一个全局作用域,也就是说,块之间的变量和函数是可以共享的。

1.6.4  借助事件机制改变JavaScript执行顺序

由于JavaScript是按块处理代码,同时又遵循HTML文档流的解析顺序,所以在上面示例中会看到这样的语法错误。但是当文档流加载完毕,如果再次访问就不会出现这样的错误。例如,把访问第2 块代码中的变量和函数的代码放在页面初始化事件函数中,就不会出现语法错误了。

<script>

// JavaScript代码块1

window.onload = function(){        // 页面初始化事件处理函数

    alert(a);

    f();

}

</script>

<script>

// JavaScript代码块2

var a =1;

function f(){

    alert(1);

}

</script>

为了安全起见,我们一般在页面初始化完毕之后才允许JavaScript代码执行,这样可以避免网速对JavaScript执行的影响,同时也避开了HTML文档流对于JavaScript执行的限制。

注意

如果在一个页面中存在多个windows.onload事件处理函数,则只有最后一个才是有效的,为了解决这个问题,可以把所有脚本或调用函数都放在同一个onload事件处理函数中,例如:

window.onload = function(){

    f1();

    f2();

    f3();

}

而且通过这种方式可以改变函数的执行顺序,方法是:简单地调整onload事件处理函数中调用函数的排列顺序。

除了页面初始化事件外,我们还可以通过各种交互事件来改变JavaScript代码的执行顺序,如鼠标事件、键盘事件及时钟触发器等方法,详细讲解请参阅第14章的内容。

1.6.5  JavaScript输出脚本的执行顺序

在JavaScript开发中,经常会使用document对象的write()方法输出JavaScript脚本。那么这些动态输出的脚本是如何执行的呢?例如:

document.write('<script type="text/javascript">');

document.write('f(); ');

document.write('function f(){ ');

document.write('    alert(1);   ');

document.write('}    ');

document.write('<//script>    ');

运行上面代码,我们会发现:document.write()方法先把输出的脚本字符串写入到脚本所在的文档位置,浏览器在解析完document.write()所在文档内容后,继续解析document.write()输出的内容,然后才按顺序解析后面的HTML文档。也就是说,JavaScript脚本输出的代码字符串会在输出后马上被执行。

请注意,使用 document.write()方法输出的JavaScript脚本字符串必须放在同时被输出的<script>标签中,否则 JavaScript解释器因为不能够识别这些合法的JavaScript代码,而作为普通的字符串显示在页面文档中。例如,下面的代码就会把 JavaScript代码显示出来,而不是执行它。

document.write('f(); ');

document.write('function f(){ ');

document.write('    alert(1);   ');

document.write(');   ');

但是,通过document.write()方法输出脚本并执行也存在一定的风险,因为不同JavaScript引擎对其执行顺序不同,同时不同浏览器在解析时也会出现Bug。

Ø 问题一,找不到通过document.write()方法导入的外部JavaScript文件中声明的变量或函数。例如,看下面示例代码。

document.write('<script type="text/javascript" src="test.js">

<//script>');

document.write('<script type="text/javascript">  ');

document.write('alert(n); ');  // IE提示找不到变量n

document.write('<//script>    ');

alert(n+1);                          // 所有浏览器都会提示找不到变量n

外部JavaScript文件(test.js)的代码如下:

var n = 1;

分别在不同浏览器中进行测试,会发现提示语法错误,找不到变量n。也就是说,如果在JavaScript代码块中访问本代码块中使用document.write()方法输出的脚本中导入的外部 JavaScript文件所包含的变量,会显示语法错误。同时,如果在IE浏览器中,不仅在脚本中,而且在输出的脚本中也会提示找不到输出的导入外部 JavaScript文件的变量(表述有点长和绕,不懂的读者可以尝试运行上面代码即可明白)。

Ø 问题二,不同JavaScript引擎对输出的外部导入脚本的执行顺序略有不同。例如,看下面示例代码。

<script type="text/javascript">

document.write('<script type="text/javascript" src="test1.js">

<//script>');

document.write('<script type="text/javascript">  ');

document.write('alert(2);')

document.write('alert(n+2);');

document.write('<//script>');

</script>

<script type="text/javascript">

alert(n+3);

</script>

外部JavaScript文件(test1.js)的代码如下所示。

var n = 1;

alert(n);

在IE浏览器中的执行顺序如图1-6所示。

图1-6  IE 7浏览器的执行顺序和提示的语法错误

在符合DOM标准的浏览器中的执行顺序与IE浏览器不同,且没有语法错误,如图1-7所示的是在Firefox 3.0浏览器中的执行顺序。

图1-7  Firefox 3浏览器的执行顺序和提示的语法错误

解决不同浏览器存在的不同执行顺序,以及可能存在Bug。我们可以把凡是使用输出脚本导入的外部文件,都放在独立的代码块中,这样根据上面介绍的JavaScript代码块执行顺序,就可以避免这个问题。例如,针对上面示例,可以这样设计:

<script type="text/javascript">

document.write('<script type="text/javascript" src="test1.js"><//script>');

</script>

<script type="text/javascript">

document.write('<script type="text/javascript">  ');

document.write('alert(2); ') ;           // 提示2

document.write('alert(n+2);   ');      // 提示3

document.write('<//script>    ');

alert(n+3);                                    // 提示4

</script>

<script type="text/javascript">

alert(n+4);                                    // 提示5

</script>

这样在不同浏览器中都能够按顺序执行上面代码,且输出顺序都是1、2、3、4和5。存在问题的原因是:输出导入的脚本与当前JavaScript代码块之间的矛盾。如果单独输出就不会发生冲突了。

AD9176 双通道高速DAC调试记录 AD9176是一款高性能双通道16位数模转换器,支持高达12.6GSPS采样率,专为多频段无线应用设计。该器件集成8通道15.4Gbps JESD204B接口,支持复数/实数数据输入,每通道最大输入速率达3.08GSPS。关键特性包括:48位高精度NCO、灵活的插值滤波器(最高12倍)、优异的动态性能(SFDR达-83dBc@1.84GHz)以及多芯片同步功能。硬件调试需重点关注时钟配置(建议250M基准时钟)、JESD参数匹配及交流耦合设计。测试指标要求SFDR>55dBc@312MHz,实测值可达65d 阅读详情

相关推荐

【yolo】YOLOv8模型导出完全指南:从PT到ONNX及其他格式的完整实践

摘要:本文全面介绍了YOLOv8模型从PT格式导出为ONNX等部署格式的完整流程与最佳实践。重点解析了关键参数(如format、imgsz、simplify)的作用机制,特别强调输入尺寸imgsz会自动继承训练尺寸的特性,并提供了ONNX、TensorRT等格式的典型导出配置方案。文章还总结了常见问题解决办法,推荐使用simplify优化模型性能,同时分享了通过C#实现模型重命名的实用技巧。最后指出"训练决定能力,导出定义接口"的核心原则,帮助开发者高效完成模型部署转换。

songhuangong123的博客 1883

JavaScript执行顺序总结

js执行顺序

qq_41872385的博客 5520

(二)使用VS2022克隆下载C++自制植物大战僵尸游戏教程

本文将介绍如何使用VS2022克隆下载《植物大战僵尸C++自制版本》。Gitee项目地址:Gitee仓库地址Github项目地址:Github仓库地址游戏官网地址(下载可直接运行)游戏官网。

尔灵尔亿的博客 4800

javascript运行机制之执行顺序详解

JavaScript是一种描述型脚本语言,它不同于java或C#等编译性语言,它不需要进行编译成中间语言,而是由浏览器进行动态地解析与执行。如果你不能理解javaScript语言的运行机制,或者简单地说,你不能掌握javascript执行顺序,那你就犹如伯乐驾驭不了千里马,让千里马脱缰而出,四处乱窜。        那么JavaScript是怎么来进行解析的吗?它的执行顺序又是如何的呢?在了解

雾里看花 4万+

js在页面上执行顺序

一、js是单线程执行的 二、js顺序执行的 三、代码: 1、index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title>

小乙先生的博客 4109

如何保证script标签的加载顺序

本章博文主要解决script标签的加载顺序问题。

李卓书 2726

JavaScript 循环对象顺序不对

而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是较老的 ECMA-262 第三版规范,属性遍历顺序由属性构建的顺序决定。它们会先提取所有 key 的 parseFloat 值为非负整数的属性,然后根据数字顺序对属性排序首先遍历出来,然后按照对象定义的顺序遍历余下的所有属性。很显然顺序跟想象的不一样,因为对象中没有顺序,他不是数组,所以想要得到一个顺序就首先要只给对象指定规则,这里是通过对象的value的字母来指定的规则。后台返回对象参数展开后如下。

qq_43487084的博客 2360

JavaScript:全面解析各种浏览器网页中的JS代码的执行顺序

        近来我通过一些测试以全面的解析网页在各种浏览器中的JavaScript代码的执行顺序,在这儿做个记录。        我们知道javaScript是一种解释型语言,他的执行是自上而下,但是各个浏览器对于至上而下的理解是有细微差别的,而代码的上下游也就是程序流又对于程序正确至关重要,所以我觉得有必要深入理解多个js块儿的执行顺序。首先得知道有多少方法能把javaScript加入到

LENEL的砖篮 7494

js等待异步执行完再执行_JavaScript 中优雅使用顺序执行异步函数

火于异步1995年,当时最流行的浏览器——网景中开始运行 JavaScript (最初称为 LiveScript)。 1996年,微软发布了 JScript 兼容 JavaScript。随着网景、微软竞争而不断的技术更新,在 2000年前后,JavaScript 相关的技术基础准备就绪。 随后到 2005 年前后,以 Google 为首开始重视使用 AJAX(即 Asynchronous Java...

weixin_39851261的博客 2万+

html页面中js执行顺序 (即javaScript执行顺序)

页面中js执行顺序:在页面的head标签中添加一段js代码,在页面的尾部也就是&lt;/body&gt;之前添加一段代码,然后在body的onload事件中引用一个函数,此三者的执行顺序如何? 下面是测试的代码: &lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt; &lt;HTML&gt; &...

zwn_software的博客 568

javaScript js代码执行顺序和键盘捕捉

js代码执行顺序 js代码在浏览器打开的时候就开始自上而下依次执行,所以可能发生js代码已经执行,而标签未执行js代码获取不到标签。 所以我们应该让js代码在所有东西加载完毕的时候执行。 注意:只要是标签中的属性,我们都可以用.来使用。 <body> <script type="text/javascript"> window.onload = function...

OVO_LQ_Start的博客 230

html文件Js执行顺序解析

html文件Js执行顺序解析 目录 常规顺序 代码: 控制台输出: 结论:先head代码再body代码 使用休眠时,“并行”还是“串行”处理? 代码 控制台输出: 结论:并行处理 使用jquery时,ready和onload谁先执行? 代码 执行结果: 结论,先ready再onload 使用ifram时,ifram内部js何时执行? 代码 执行结果 结论,ifram内代码在ready后,onload前执行 html文件js执行顺序js代码位置、是否使用第三方库等因素

BlueSea_W的专栏 2128

JavaScript执行顺序

接触js一段时间以来,觉得只是了解了很浅层的东西。对于很多基础的知识还是很欠缺的。所以开始使用博客来对这一部分的知识做个慢慢的记录和积累。相信积少成多,慢慢的将这一部分的知识攻克!        第一篇记录的不是相关的应用,而是很底层的知识---JavaScript解析引擎。想要了解这一部分的知识也是通过在项目中遇到的问题而联想到的。

庞凡 坚定自己踏实走好每一步 1876

js代码执行顺序简单介绍,jsp中javascript 执行顺序

第一个微任务执行完毕,开始执行第二个宏任务setTimeout,遵循先执行主线程宏任务,再执行微任务process.nextTick,输出2,4,3,5;开始执行第三个宏任务setTimeout,遵循先执行主线程宏任务,再执行微任务,输出9,11,10,12。3、宏任务里如果有宏任务,不会执行里面的那个宏任务,而是被丢进任务队列后面,所以会最后执行。此时,主代码块执行完毕,即第一个宏任务执行完毕,开始执行微任务,输出 6,8;1、微任务是在宏任务的执行中产生的,所以一开始程序执行时是没有微任务的。

wenangou的博客 276

javascript 代码运行顺序说明

一. 步骤说明 预解析 --- 把所有的函数定义提前,所有的变量声明提前,变量的赋值不提前。 执行 --- 从上到下执行 (setTimeout,setInterval,ajax中的回调函数,事件中的函数需要触发执行)。 二. 示例 原代码: <!DOCTYPE html> <html> <head> <title>代码运行说明&l...

weixin_40461030的博客 282

Javascriptjs语句执行顺序

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34248258的博客 456

js代码执行顺序简单介绍,详细说明js执行过程

v8引擎工作原理:Parser:负责将JavaScript源码转换为Abstract Syntax Tree (AST);如果函数没有被调用,那么是不会被转换成AST的Ignition:interpreter,即解释器,负责将AST转换为Bytecode,解释执行Bytecode;同时收集TurboFan优化编译所需的信息,比如函数参数的类型,有了类型才能进行真实的运算;如果函数只调用一次,Ignition会执行解释执行ByteCode解释器也有解释执行bytecode的能力。

chatgpt002的博客 211

前端高手进阶第09讲:为什么代码没有按照编写顺序执行

这一课时涉及了 JavaScript 的核心特性——异步,先从异步概念说起,然后深入异步原理讲述了事件循环和事件队列,最后列举了 3 个常见异步场景的处理方法。异步属于笔试题必考的考点,比如任务队列部分,将 setTimeout/Promise/nextTick 这些异步函数和对象进行任意组合即可出题,所以一定要理解原理。最后布置一道思考题:尝试使用RxJS实现多个 Promise 的串行和并行,并说说它在处理异步方面的优缺点。

sucaiwa的博客 1034

ECharts入门

@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ECharts</title> <!-- 引入 echarts.js --> <script src="...

qq_45835940的博客 3522

JavaScript--代码执行顺序

第一个微任务执行完毕,开始执行第二个宏任务setTimeout,遵循先执行主线程宏任务,再执行微任务process.nextTick,输出2,4,3,5;开始执行第三个宏任务setTimeout,遵循先执行主线程宏任务,再执行微任务,输出9,11,10,12。3、宏任务里如果有宏任务,不会执行里面的那个宏任务,而是被丢进任务队列后面,所以会最后执行。此时,主代码块执行完毕,即第一个宏任务执行完毕,开始执行微任务,输出 6,8;1、微任务是在宏任务的执行中产生的,所以一开始程序执行时是没有微任务的。

wjbltxx的专栏 1631

JavaScript 执行顺序梳理 , 建议收藏!

一.概念 1.解释型语言执行步骤 预编译 扫描上下文。扫描错误 函数和变量声明的提升 解释执行 一条一条执行代码 2.任务队列event queue ????异步任务进入event queue任务队列 所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务

Jack, what else can you do besides holding your little darling? 1604

js代码不按顺序执行以及解决方法

1、不按顺序执行的代码(主要是initCourseForm的方法) <template> <div class="app-container"> <el-steps :active="1" finish-status="success"> <el-step title="填写课程基本信息"></el-step>...

CSDN_KONGlX的博客 1397

Sim-EKB-Install-2024-12-07-Run-Admin 博途 V20授权

Sim-EKB-Install-2024-12-07-Run-Admin 博途 V20授权是一个软件安装程序,主要针对博途(TIA Portal)V20版本的授权管理。TIA Portal是西门子自动化和驱动技术的集成自动化工程软件,广泛应用于工业自动化领域。用户通过该安装程序可以安装和运行博途V20的授权管理模块,从而进行相关产品的授权设置和管理。在工业自动化领域,授权管理是确保软件合法性、有效性和安全性的关键环节。授权安装程序通常包含了软件授权的必要组件,以确保用户能够获得产品的合法使用权。博途V20作为该领域内的一款重要软件,其授权安装程序的出现,对于维护用户权益、保障软件稳定运行和遵守法律法规都具有重要作用。Sim-EKB-Install-2024-12-07-Run-Admin 博途 V20授权安装程序的文件名为Sim_EKB_Install_2024_12_07_Run_Admin.exe,这是一个可执行文件(.exe),用户需要在Windows操作系统环境下运行此程序。执行文件后,用户通常会按照安装向导的步骤进行授权管理模块的安装和配置。在使用此类授权安装程序之前,用户应该确保他们的计算机系统满足博途V20授权管理模块的运行要求。这包括但不限于操作系统版本的兼容性、硬件资源需求等。另外,用户还需要具备有效的授权密钥或授权文件,以便顺利完成授权的安装和激活过程。由于Sim-EKB-Install-2024-12-07-Run-Admin 博途 V20授权是针对特定版本的软件,因此用户在使用时也需要注意授权文件的版本与软件版本的对应关系。不同版本的博途软件可能使用不同版本的授权管理模块,因此在安装前应仔细检查兼容性。此外,授权安装程序的使用还涉及到软件许可的管理和维护,这包括但不限于软件的许可升级、许可证的更新、许可证的撤销等功能。这些功能确保

遥感软件操作综合实习.ppt

遥感软件操作综合实习.ppt

上一篇: JavaScript 中的 this
下一篇: php 中的 __FILE__ 和 dirname(__FILE__)
a7458969
博客等级 码龄17年 12粉丝 19原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值