首页

文章

js文件怎么运行

发布网友 发布时间:2022-04-19 18:39

我来回答

2个回答

懂视网 时间:2022-04-29 14:57

高级语言之所以称之为“高级”,就是因为它更加符合我们的思维和阅读习惯。if…else这种语句看起来要比1010101010舒服的多了。但是计算机并不能直接执行高级语言,所以还需要把高级语言转化为汇编语言/机器指令才能执行。这个过程就是编译。

JavaScript 需要编译吗?

JavaScript毫无疑问是高级语言,所以它肯定是需要编译后才能执行。但为什么我们又称之为解释型语言呢?它和编译型语言、半解释半编译型语言又有什么区别呢?我们先从编译说起。

编译

之前我们已经了解编译的概念,下面我们来聊聊平台:同样一份C++代码在Windows上会编译成.obj文件,而在Linux上则生成.o文件,两者不能通用。这是因为一个可执行文件除了代码外还需要操作系统 API、内存、线程、进程等系统资源,而不同的操作系统其实现也不尽相同。比如我们熟悉的I/O多路复用(事件驱动的灵魂),在Windows上的实现方案是IOCP方案,在Linux上是epoll。所以针对不同的平台,编译型语言需要分别编译,甚至需要分别编写,而且生成的可执行文件其格式并不相同。

跨平台

Java在此之上更进一步,它通过引入字节码实现了跨平台运行:无论是在什么操作系统上.java文件编译出的都是.class文件(这就是字节码文件,一种中间形态的目标代码)。然后Java对不同的系统提供不同的Java虚拟机用于解释执行字节码文件。解释执行并不生成目标代码,但其最终还是要转为汇编/二进制指令来给计算机执行的。

假如我们自己完全独立的新写一个简单的操作系统,那么它能不能运行Java呢?很显然是不能的,因为并没有这个系统相应的JVM。所以Java的跨平台、任何其他语言的跨平台,都是有局限性的。

Java采用半解释半编译的好处就是大大提升了开发效率,然而相应的则降低了代码的执行效率,毕竟虚拟机是有性能损失的。

解释执行

JavaScript则更进一步。它是完全的解释执行,或者叫做即时编译。它不会有中间代码生成,也不会有目标代码生成。这个过程通常由宿主环境(如浏览器、Node.js)包办。

编译过程

现在我们确认了,即使是解释执行的语言,也是需要编译的。那么代码是如何编译的呢?我们来简单了解一下。

词法分析

词法分析会把语句分解成词法单元,即Token。

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!
"; 
 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:

    2.jpg

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

    结语

    现在我们已经了解JavaScript是如何运行的。但是了解这些能够帮我们写出更好的代码吗?

    答案是肯定的。且不说TypeScript能够帮助我们完善类型检查和类型推断,JavaScript的作用域、this也是和编译过程强相关的;而目前主流的小程序框架都能够支持一套代码、多个平台,相信读完本文后,你大致也了解了这些技术背后的原理。
    Happy Hacking!

    本文来自 js教程 栏目,欢迎学习!

    热心网友 时间:2022-04-29 12:05

    1、浏览器控制台运行

    JavaScript不同于java语言或者c语言,需要环境、需要编译再运行,js在被制造出来时,就是为浏览器而生,可以直接在浏览器里运行,这里以谷歌浏览器为例,鼠标右键检查或者快捷键F12即可看到控制台可以理解为操作系统里的命令行模式

    在这里就可以直接输入我们想输入的js代码,回车即可查看代码执行结果

    在浏览器输入js代码的好处显而易见:方便,打开浏览器就能输代码查看执行结果,我平常也多用浏览器控制台学学原生js的原理或者看看正则是不是匹配,因为浏览器控制台的缺点太多了:操作不便,没法文件操作只能命令行,找错困难,大多数时候的js是有依赖的,控制台不方便整依赖,所以,一般控制台也就执行执行简单原生的js

    2、写在HTML里运行

    实际上,我们肯定不想用命令行的方式,当然是用一个顺手的IDE写代码。

    这种方式,就是我大学时候,老师们教的传统方式了。

    学HTML的时候,会教到标签,有一个标签不同于别的花里胡哨的标签,这个标签很牛,叫做<script>脚本标签,用来嵌入或者引用可执行脚本,这里解释一下嵌入和引用。嵌入呢,就是把脚本写在标签里边儿,引用呢,就是把脚本写好,然后用标签引入这个脚本的路径

    这是主流的写法也是主流的教法,嵌入的写法就是这样:

    引用的写法是这样:

    查看执行结果的话,点击IDE边上的浏览器图标或者右键run这个html页面,等浏览器弹出来,右键检查就能看到控制台输出的值了

    3、直接运行js

    实际上上面第二种方法已经很靠谱很普及了,可还是用起来不舒服,每回都要写一个HTML,有的甚至还要再写一个js,那能不能像运行html一样,直接右键运行js呢?

    当然是可以的!用node!以下是我花了一个小时才整成的历程!

    1、由于我是新的电脑,我装了个nodejs,安装包安装完后,直接命令行执行node命令,即可以直接运行js代码

    这样方式还是很蠢,和浏览器没什么区别

    2、我用IDE些好的js文件,然后用node单独执行

    看上去是好一点了,可以单独执行文件了,但是这样还是很蠢,每回打开cmd还要找到js的路径

    3、插件(我这里用的IDEA)

    玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 如何执行javascript代码 如何运行javascript 使用美图秀秀,如何把图片宽度大小变得一致。 交强险标志不用贴在汽车上? 家里没有宽带,用紫米随身路由器发射wifi,小米摄... zmi随身路由器如何设置连接数 zmi随身路由器 手机连接不上,输入密码后总是显示... 紫米随身路由器 初始密码怎么找回,背后的标签已经... 2019卖新车交保险都不用贴保险标志在玻璃上了吗 Zmi紫米随身路由器怎么关机呢?长按是开机,之后短... 紫米4g随身路由器怎么样 紫米路由器使用教程 zmi 4g随身mifi 路由器信号怎么样 ZMI随身路由器如何连接iPhone zmi随身路由器怎么修改密码 紫米4G随身路由器怎么使用? 随身wifi哪一个品牌最好。信号好? 紫米zmi-4g三网通随身路由 绿色的灯狂闪,就是上不... 紫米4g随身路由器怎么用 zmi随身路由器设置 随身路由器怎么设置 紫米随身路由器 紫米随身路由器怎么关 怎么运行JavaScript文件? 如何运行javascript程序 快手更新之后怎么取消 如何运行javascript代码 如何运行javascript? 快手上传一半怎么取消? 怎么打开JavaScript javascript是怎么执行的 快手的广告怎么关掉 javascript怎样才能运行 快手怎么取消绑定支付宝 怎么开启JavaScript ? 快手春季盛典怎么取消 javascript应该怎么调用呢? 快手延长收货怎样取消 如何让浏览器运行javascript代码的? 怎么运行JavaScript文件啊? 怎样将快手实名取消解绑? 怎样用浏览器运行javascript 怎样一次性取消快手上所有的喜欢
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com