美文网首页
JS进阶之路

JS进阶之路

作者: zbcy0012 | 来源:发表于2024-02-27 09:28 被阅读0次

    【前言】

    这里有很多杂项知识,必须的、非必须的、冷门的、有趣的。总之学而有益身心,谓之技多不压身。本文内容来源于网络搜索和个人经验,如有谬误请评论区留言,不胜感激。本文章持续更新。

    《严格模式》

    除了正常运行模式,ECMAScript 5添加了第二种运行模式:严格模式(strict mode)。顾名思义,这种模式使得 JavaScript 在更严格的条件下运行。
    与之相反的非严格模式,被称为sloppy mode,也称之为 正常模式。因为翻译原因,正常模式也被翻译为 —— 马虎模式/稀松模式/懒散模式。但这并不是一个官方术语,但是你会经常见到如上的一些说法,其意义就是指代非严格模式,即正常模式。
    设立严格模式的目的,主要有以下几个:

    • 消除 JavaScript 语法的一些不合理、不严谨之处,减少一些怪异行为;
    • 消除代码运行的一些不安全之处,保证代码运行的安全;
    • 提高编译器效率,增加运行速度;
    • 为未来新版本的 JavaScript 做好铺垫。
      严格模式体现了 JavaScript 更合理、更安全、更严谨的发展方向,包括 IE10 在内的主流浏览器都已经支持它,许多大项目已经开始全面拥抱它。另一方面,同样的代码,在严格模式中,可能会有不一样的运行结果;一些在正常模式下可以运行的语句,在严格模式下将不能运行。
      你可以在整个脚本文件使用严格模式,或者针对某函数单独声明。

    有何变化?

    • 不允许意外创建全局变量
    • 不允许引起静默失败的赋值操作
    • 试图删除不可删除的属性时会抛出异常
    • 不允许删除变量或对象
    • 不允许删除函数
    • 不允许函数参数重名
    • 不允许对象属性重名
    • 不允许使用八进制
    • 不允许使用转义字符
    • 禁止this关键字指向全局对象
    • 不能给arguments赋值
    • 不能调用在作用域 eval() 创建的变量

    摘自百度搜索
    摘自知乎

    《ECMAScript简介及特性》

    什么是ECMAScript

    ECMAScript 是一种由 ECMA国际(前身为欧洲计算机制造商协会)通过 ECMA-262 标准化的脚本程序设计语言。
    Ecma国际(Ecma International)是一家国际性会员制度的信息和电信标准组织。1994年之前,名为欧洲计算机制造商协会(European Computer Manufacturers Association)。因为计算机的国际化,组织的标准牵涉到很多其他国家,因此组织决定改名表明其国际性。现名称已不属于首字母缩略字。
    与国家政府标准机构不同,Ecma国际是企业会员制的组织。组织的标准化过程比较商业化,自称这种营运方式减少官僚追求效果。
    其实 Ecma国际负责了很多标准的制定,比如有如下这些规范。大家可以看到这里面有我们今天的主角,ECMAScript 规范、 C#语言规范、 C++/CLI语言规范等。

    ECMAScript 和 JavaScript 的关系

    1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。
    该标准从一开始就是针对 JavaScript 语言制定的,但是之所以不叫 JavaScript,有两个原因。一是商标,Java 是 Sun 公司的商标,根据授权协议,只有 Netscape 公司可以合法地使用 JavaScript 这个名字,且 JavaScript 本身也已经被 Netscape 公司注册为商标。二是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放性和中立性。
    因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现。

    ES6 与 ECMAScript 2015 的关系

    ECMAScript 2015(简称 ES2015)这个词,也是经常可以看到的。它与 ES6 是什么关系呢?
    2011 年,ECMAScript 5.1 版发布后,就开始制定 6.0 版了。因此,ES6 这个词的原意,就是指 JavaScript 语言的下一个版本。
    但是,因为这个版本引入的语法功能太多,而且制定过程当中,还有很多组织和个人不断提交新功能。事情很快就变得清楚了,不可能在一个版本里面包括所有将要引入的功能。常规的做法是先发布 6.0 版,过一段时间再发 6.1 版,然后是 6.2 版、6.3 版等等。
    标准委员会最终决定,标准在每年的 6 月份正式发布一次,作为当年的正式版本。接下来的时间,就在这个版本的基础上做改动,直到下一年的 6 月份,草案就自然变成了新一年的版本。这样一来,就不需要以前的版本号了,只要用年份标记就可以了。
    因此,ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年发布的正式版本的语言标准。
    摘自知乎

    《CommonJs规范》

    【规范定义】
    每一个文件是一个模块,有自己的作用域
    在模块内部的module变量代表模块本身
    module.exports属性代表模块对外接口

    【require规则】
    /表示绝路径,./表示相对于当前文件的路径
    支持js、json、node扩展名,不写就依次尝试
    不写路径名就认为是build-in模块或者各级node_modules内第三方模块

    【require特性】
    module被加载的时候执行,加载后缓存;
    一旦出现模块被循环加载,就只输出已经执行的部分,还没有执行的部分就不会输出
    摘自知乎

    《CommonJS 和 ES的区别》

    1. 语法差异

    • CommonJS:使用require()函数来导入模块,使用module.exportsexports来导出模块。

    • ES Modules(ESM):使用import语句来导入模块,使用export语句来导出模块。

    2. 运行时加载和静态加载

    • CommonJS:模块的导入和导出是在运行时动态执行的,因此在运行时才能确定模块的依赖关系。

    • ES Modules:模块的导入和导出是在代码静态分析阶段处理的,这使得在构建时就能确定模块的依赖关系。

    3. 浏览器支持

    • CommonJS:最初是为服务器端开发设计的,不适用于浏览器环境。但是,可以通过工具(如Browserify、Webpack等)将CommonJS模块转换为浏览器可用的代码。

    • ES Modules:现代浏览器和Node.js都支持ES模块,可以直接在浏览器中使用<script type="module">标签导入和使用ES模块。

    4. 默认导出

    • CommonJS:可以使用module.exports导出一个值,这个值是模块的默认输出。

    • ES Modules:使用export default语法来指定默认导出。

    5. 导入方式

    • CommonJSrequire()是同步的,导入的模块会被缓存,多次导入同一个模块不会重复执行。

    • ES Modulesimport是异步的,模块的导入是动态的,每次导入都会重新执行模块内的代码。

    6. 导入模块成员的方式

    • CommonJS:模块成员被复制一份,修改不会影响原始模块。

    • ES Modules:模块成员在导入时是引用,修改会影响原始模块。

    7. 循环依赖处理

    • CommonJS:支持循环依赖,但是模块的导入和导出是在运行时执行的,可能会导致一些问题。

    • ES Modules:通过静态分析处理循环依赖,可以更好地处理这种情况。

    综上所述,CommonJS主要是在服务器端使用,而ES Modules是现代浏览器和Node.js中推荐的模块系统,具有更好的静态分析和性能优势。随着浏览器和Node.js的发展,ES Modules逐渐取代了CommonJS的地位。
    摘自知乎

    《.mjs文件和普通.js文件的区别》

    • 默认异步加载:ECMAScript 模块默认支持异步加载,这有助于提高代码的执行性能。而 CommonJS 模块默认是同步加载的。
    • 文件扩展名:虽然这并不是一个技术上的差异,但通常约定将 ECMAScript 模块保存为 .mjs 文件,而将 CommonJS 模块保存为 .js 文件。这有助于区分两种不同类型的模块。

    【.mjs文件特点】

    • 强制使用严格模式:由于在es6以后的版本中必须引用头部的'use strict'语句来启动严格模式,而.mjs文件默认为严格模式。这意味着变量声明必须先进行,不能使用未定义的变量,并且禁止使用eval和arguments。
    • es模块语法:.mjs文件支持es模块的导入和导出语法(import和export)。这种语法相比commonjs规范中的require()和module.exports更加优雅、先进和简单。
    • 支持动态导入:.mjs文件支持异步加载实现动态导入,可以在运行时按需获取模块,而不需要预先配置所有依赖项。
    • 不允许以下语法:.mjs 文件也不支持commonjs语法(require())和amd语法(define()),因此如果要在一个.mjs文件中使用npm包或其他commonjs模块,则需要通过一个额外的脚本转换。

    .mjs文件更像是一个现代化的es6程序,它已经成为了加快javascript web应用性能和保证可维护性的一个重要工具。

    相关文章

      网友评论

          本文标题:JS进阶之路

          本文链接:https://www.haomeiwen.com/subject/odutzdtx.html