JavaScript运行命令

JavaScript运行命令

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

前言

       动人js一段时间,我认为事情仅仅是一个很肤浅的理解。是非常欠缺的。所以開始使用博客来对这一部分的知识做个慢慢的记录和积累。

相信积少成多,慢慢的将这一部分的知识攻克!

       第一篇记录的不是相关的应用。而是非常底层的知识—JavaScript解析引擎。

想要了解这一部分的知识也是通过在项目中遇到的问题而联想到的。

问题的背景

       在一段脚本中,运行的顺序是先将js文件里的alert()运行了一遍,然后当我详细调用到那个函数的时候再运行这个函数。当时看到就产生了一个疑问:运行函数之前为什么运行了alert(),非常明显他没有运行我定义的函数,却运行了alert();

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>js运行測试</title>
</head>
<script>
	var a ;
	a = 1;
	function f1(){ alert("第一个函数"); }
	alert("測试");
	function f2(){ alert("第二个函数"); }
	alert(a);
	function f3(){ alert("第三个函数"); }
</script>

<body>
	<div>
		<a herf="#" onclick="f1()">測试</a>
	</div>
</body>
</html>

运行结果是:測试   1


须要了解的前提

         须要了解两个概念,一个是JavaScript解析引擎。另外一个是JavaScript解析引擎和浏览器的关系

1.JavaScript解析引擎

  解释运行脚本的程序。

能够看成是一个解释器。

  这个引擎须要完毕两个功能:
     一是解释脚本程序,将js代码读懂。
     二是运行脚本程序,将脚本程序读懂之后就要运行这个程序。

   比方在一篇博客中看到的一个样例。当你写了 var a = 1 + 1; 这样一段代码,JavaScript引擎做的事情就是看懂(解析)你这段代码,而且将a的值变为2。
     看这个概念的时候还想起另外一个概念就是编译器,它仅仅是将源码编译成第二种代码(比方机器码。或者字节码)。就好象是一个翻译官,将中文翻译成英文。它不可以运行这段程序。

2.JavaScript解析引擎和浏览器的关系

        JavaScript解析引擎是浏览器的组成部分之中的一个。
        当了解了前提之后我们知道,我们写的js代码是须要通过浏览器中的JavaScript解析引擎解析运行的,详细的解析机制大家能够google一下,我对这部分了解不深,仅仅知道了解各大概。但是我认为这些知识对于我了解其它的知识已经足够了。
       解析机制分为两个大过程,一个编译过程,另外一个是运行过程。编译过程终于是在内存中构建一个语法树。运行过程就是依照语法树来运行代码。对于编译和运行内部详细的运行我就不清楚了。


js代码在页面中的运行顺序

      上面讲到的都是一些理论知识。以下就来看看我们在实际应用过程中会js代码在页面中的运行顺序。这些就是上面理论知识的一些非常形象的反应。

1. 引擎对js解析—预编译和运行顺序关系

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

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>js运行測试</title>
</head>
<script>
	alert(a);   //undefined
	var a ;
	a = 1;
	function f1(){ alert("第一个函数"); }
	alert("測试");  //測试
	function f2(){ alert("第二个函数"); }
	alert(a);  //1
	function f3(){ alert("第三个函数"); }
</script>

<body>
	<div>
		<a herf="#" onclick="f1()">測试</a>
	</div>
</body>
</html>

运行结果是: undefined   測试  1 

       预编译做的工作:将声明的变量和函数做处理。从而使其在运行期间对全部的代码都是可见的。

       可是,你也会看到。运行上面代码。提示的值是 undefined,而不是1。

这是由于,变量初始化过程发生在运行期,而不是预编译期。

在运行期,JavaScript解释器是按着代码先后顺序进行解 析的,假设在前面代码行中没有为变量赋值。则JavaScript解释器会使用默认值undefined。由于在第二行中为变量a赋值了。所以在第三行代 码中会提示变量a的值为1,而不是undefined。


2. 文件流载入时—js依照HTML文档流顺序运行

      js能够看成HTML文档的组成部分。

HTML文档是从上到下逐步解析的。不管是使用<script></script>块还是使用外部引用的js文件都是如此。

使用外部js文件引用,将上面的代码写到js文件里。运行结果不变

<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>js运行測试</title>
</head>
<script type="text/javascript" src="Untitled-2.js"></script>
<body>
	<div>
		<a herf="#" onclick="f1()">測试</a>
	</div>
</body>
</html>

js文件

var a ;
a = 1;
function f1(){ alert("第一个函数"); }
alert("測试");
function f2(){ alert("第二个函数"); }
alert(a);
function f3(){ alert("第三个函数"); }


运行结果:測试  1  

3. 文件流载入完毕之后—依照事件机制改变js运行顺序

类似于调用函数,在哪里调用到就在此处运行,假设没有调用到就不运行。从上面的代码中能够看到。为a标签加入了点击事件。所以当单击的时候会运行相应的函数

总结

所以能够解释为什么alert()运行了,而函数没有运行。js解析引擎要有一个预编译过程,对定义的变量和函数做处理。

同一时候js还要依据HTML文档流的顺序运行。

这就是运行我自定义的函数之前的过程,而我所以的运行自定义的函数事实上是事件机制调用js的一个体现。



版权声明:本文博客原创文章。博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117369.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 华为太极magisk安装教程_教程:如何升级太极内部的应用

    华为太极magisk安装教程_教程:如何升级太极内部的应用使用过太极的小伙伴都知道,要把应用添加到太极(magisk版除外)中是个麻烦事儿:首先得花费大量的时间来创建应用,然后还必须卸载原来的应用,安装完毕之后又要花很长的时间来优化。如果待创建的应用安装包比较大并且你手机的CPU不在工作状态,那这个流程就不是一般的长了。这时候就有童鞋会问了,如果我在太极里面创建的应用要升级了怎么办?是不是每次升级都需要卸载原应用?实际上,在太极内部升级应用…

    2022年6月3日
    162
  • pycharm中安装包

    pycharm中安装包1、pycharm中万能提示键1、在import中导入包时,下方出现红色波浪线,表明当前python中存在该2、将鼠标停留在红色波浪线上,按Alt+Enter3、选择Installpackagenumpy4、查看已经安装的包,File—>Settings—>ProjectInterpreter2、在ProjectInterpreter中管理包1、包的升级和删除2.包的安装3.安装指定的包和指定的版本…

    2022年5月16日
    40
  • STL容器分类「建议收藏」

    STL容器分类「建议收藏」容器(container)是装有其他对象的对象。容器里面的对象必须是同一类型,该类型必须是可拷贝构造和可赋值的,包括内置的基本数据类型和带有公用拷贝构造函数和赋值操作符的类。典型的容器有队列、链表和向量等。在标准C++中,容器一般用模版类来表示。不过STL不是面向对象的技术,不强调类的层次结构,而是以效率和实用作为追求的目标。所以在STL并没有一个通用的容器类,各种具体的容器也没有统一的基类。

    2022年9月12日
    2
  • C++ int与string的相互转换(含源码实现)

    C++ int与string的相互转换(含源码实现)一、int转换成stringⅠ、to_string函数c++11标准增加了全局函数std::to_string:stringto_string(intval);stringto_str

    2022年7月3日
    21
  • Java中级面试题及答案(120道Java中级面试题大汇总)[通俗易懂]

    Java中级面试题及答案(120道Java中级面试题大汇总)[通俗易懂]Java中级面试题及答案【最新版及答案,干货!!!这是一个中级Java面试系列题中的第一部分。这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题。Java中级面试永远是程序员迈向成功的第一个门槛,想要面试成功,各种面试题的洗礼是必不可少的,下面就来看看小编精心整理的一些java高级工程师面试题及答案吧。如果不背Java面试题的答案,肯定面试会挂!这套Java面试题大全,希望对大家有帮助哈~博主已将以下这些面试题整理成了一个Java面试手册,是PDF版的

    2022年6月15日
    43
  • Mac使用Boot Camp安装win10(不用U盘)

    Mac使用Boot Camp安装win10(不用U盘)原文在https://bbs.feng.com/forum.php?mod=viewthread&tid=10748184&page=1&mobile=no大概的步骤:1、从微软官网下载win10专业版本iso文件(文件有4.6G,官网白天下载很慢,晚上下载快点);2、使用MacOS自带的BootCamp(新兵训练营?)安装win10,BootCamp安装时会从官网服务器下载支

    2022年5月12日
    142

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号