JavaScript是怎么运行的

技术JavaScript是怎么运行的这篇文章主要讲解了“JavaScript是怎么运行的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript是怎么运行的”吧

JavaScript更进一步。它是完全解释执行,或即时编译。不会有中间代码生成或目标代码生成。这个过程通常由主机环境(如浏览器、Node.js)来安排。

什么是JavaScript?

现在我们已经确认,甚至解释执行的语言也需要编译。那么代码是如何编译的呢?让我们简单看一下。

代码是怎么运行的?

词汇分析将语句分解成词汇单元,即Token。

"brush:php;toolbar:false">function square(n){ return n*n;}

这个函数会被词法分析器识别为function square(n){return,,n ,*n}并且给它们加上标注,代表这是一个变量还是一个操作。

语法分析

这个过程会把Token转化成抽象语法树(AST):

{ type:'function',    id:{        type:'id'        name:'square'    },    params:[        {            type:'id',            name:'n'        }    ]    ...}

优化及代码生成

在这一步编译器会做一些优化工作,比如删除多余运算、删除未用赋值、合并部分变量等等操作,最后生成目标代码。

由于即时编译型语言的编译通常发生在运行前几微秒,所以编译器来不及做太多的优化工作。这也是相比编译型语言,早期JavaScript性能孱弱的原因之一。不过就现在而言,益于 V8 引擎(相比早期的JavaScript的引擎转换成字节码或解释执行,Node.js可以用 V8 提供的 JS2C 工具将 JavaScript 转译为 C++代码),JavaScript 和其他语言性能上的差距已经不足为道了。

链接及装载

目标代码基本不能独立运行。应用程序一般都会由多个部分(模块)组成 ,比如C++中一个简单的输出就要引入标准库 iostream

#include <iostream>using namespace std;int main(){        cout << "Happy Hacking!\n";        return 0;}

编译器需要把多份目标代码(库)链接起来才能生成可执行文件。至此,我们简单的了解了编译过程。但实际上编译比我们所讲的要复杂得多,在此就不在展开了。

什么是动态语言,动态类型?

我们还知道,JavaScript是动态语言。那么什么是动态语言?

通常来说,这是指在运行时代码可以根据某些条件改变自身结构的语言。比如JavaScript在运行时新的函数、对象、甚至代码都可以被引进(eval);又比如Objective-C,它也可以在运行时修改对象,但它不能动态创建类,也没有 eval 方法。那Objective-C算是动态语言吗?所以我认为,动态语言是个程度的问题,我们不必在这个概念上太过纠结,可以更多的关注其应用。APP中常用的热更新功能就是基于动态语言特性而得以实现的。

JavaScript又是一门动态类型的语言,动态类型又是什么?动态类型的定义倒是很明确:数据类型不是在编译阶段确定,而是在运行时确定。

那么 TypeScript 是什么类型的语言呢?它有静态类型检查,它是静态语言吗?实际上它只是 JavaScript 的一个方言。TypeScript 最终还是要转译为 JavaScript 才能执行(tsc),就如同我们使用babel 把 ES6 代码转译为 ES5 一样。这个过程严格上来说不是编译。

TypeScript 最大的优势就是静态类型检查和类型推断,这是 JavaScript 严重缺失的能力。但实际上如果我们忽略IDE 给的报错提示强行运行 TS 代码,也还是有几率能够成功跑起来的。

错误

刚刚我们提到报错,不妨再扩展说一说错误。通常来说错误分为以下几种:

编译时错误链接时错误运行时错误

是不是和编译过程能够严格对应起来?

编译时错误

编译时错误分为:

语法错误

var str ='s ;

这就是典型的语法错误,这种代码无法生成AST,在词法分析阶段就会报错。通常我们这么写代码,IDE 就会报错。这是IDE的优化工作,和词法分析相关。

类型错误

编译器会检查我们声明的变量和函数的类型,JavaScript中我们非常熟悉的Type Error:undefined is not object就是此类错误。

链接时错误

在链接阶段发生的异常。这种情况 JavaScript 中比较少见,在编译型语言中比较常见。

运行时错误

这是最难排查的错误了,举例来说:

int pider(int a,int b){    return a/b;}

上面的代码在编辑编译、链接阶段都没问题,也能够正常的生成可执行文件。但是一旦如此使用pider(1,0)就会报错了,这就是典型的运行时错误。通常来说运行时错误都是程序不够健壮导致的。

JavaScript中最常见的十个错误:

下图是某错误处理平台收集统计的JavaScript Top10 错误,其中7个TypeError,1个 ReferenceError:

显然这 8 种问题,我们都能用 TypeScript 在编码早期及时应对。

感谢各位的阅读,以上就是“JavaScript是怎么运行的”的内容了,经过本文的学习后,相信大家对JavaScript是怎么运行的这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/107420.html

(0)

相关推荐

  • VBS如何读取配置文件配置项

    技术VBS如何读取配置文件配置项这篇文章主要为大家展示了“VBS如何读取配置文件配置项”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VBS如何读取配置文件配置项”这篇文章吧。

    攻略 2021年11月1日
  • C++怎么结合使用泛型和面向对象技术

    技术C++怎么结合使用泛型和面向对象技术本篇内容介绍了“C++怎么结合使用泛型和面向对象技术”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅

    攻略 2021年11月24日
  • 铁与稀盐酸反应的化学方程式,用稀盐酸除铁锈的化学反应方程式

    技术铁与稀盐酸反应的化学方程式,用稀盐酸除铁锈的化学反应方程式铁锈的主要成分是氧化铁(fe2o3)铁与稀盐酸反应的化学方程式,将生锈的铁钉放入稀盐酸中,先是表面的铁锈的主要成分氧化铁与盐酸反应生成氯化铁与水,反应现象为:

    生活 2021年10月23日
  • 为什么strace在Docker容器中无法工作

    技术为什么strace在Docker容器中无法工作本篇内容主要讲解“ 为什么strace在Docker容器中无法工作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ 为什么st

    攻略 2021年11月2日
  • 信息安全工程师-软考中级-备考笔记:第十一章 网络物理隔离技术原理与应用

    技术信息安全工程师-软考中级-备考笔记:第十一章 网络物理隔离技术原理与应用 信息安全工程师-软考中级-备考笔记:第十一章 网络物理隔离技术原理与应用第11章 网络物理隔离技术原理与应用
    网络物理隔离概

    礼包 2021年11月14日
  • 金牛座和什么星座最配,金牛座和什么星座最配呢

    技术金牛座和什么星座最配,金牛座和什么星座最配呢金牛座与其它星座的互动关系 最欣赏的星座-处女座 最信任的星座-狮子座金牛座和什么星座最配、射手座
    最佳学习对象-天蝎座
    最佳工作搭档-双子座
    最容易被影响星座-水瓶

    生活 2021年10月26日