ES6标准---【九】【学习ES6标准看这一篇就够了!!!】

目录

以往ES6文章

JavaScript在浏览器中的加载

传统方法

加载规则

注意

顶部变量外部不可用

this关键字返回undefined

JavaScript的循环加载

ES6模块的循环加载

块级作用域

let取代var

全局变量和线程安全

以往ES6文章

ES6标准---【一】【学习ES6看这一篇就够了!!】_es6学习-CSDN博客

ES6标准---【二】【学习ES6看这一篇就够了!!】_es6中的includes-CSDN博客

ES6标准---【三】【学习ES6看这一篇就够了!!!】-CSDN博客

ES6标准---【四】【学习ES6标准看这一篇就够了!!!】_es6 有arguments 吗-CSDN博客

ES6标准---【五】【看这一篇就够了!!!】-CSDN博客

ES6标准---【六】【学习ES6标准看这一篇就够了!!!】-CSDN博客

ES6标准---【七】【学习ES6标准看这一篇就够了!!!】-CSDN博客

ES6标准---【八】【学习ES6看这一篇就够了!!!】-CSDN博客

JavaScript在浏览器中的加载

传统方法

HTML网页中,浏览器通过<scipt>标签加载JavaScript脚本

<!-- 页面内嵌的脚本 -->
<script type="application/javascript">
  // module code
</script>
<!-- 外部脚本 -->
<script type="application/javascript" src="path/to/myModule.js">
</script>

一般情况下,浏览器是同步加载JavaScript脚本

渲染引擎遇到<script>标签就会停下来,等到执行完脚本,再继续向下渲染

这就造成如果脚本体积很大,渲染时间会很长,造成浏览器堵塞,所以浏览器允许脚本异步加载,下面是两种异步加载方法:

  • defer:等待整个页面在内存中正常渲染结束(DOM结构完全生成,其它脚本执行完成),才会执行
  • async:一旦下载完,渲染引擎就会中断渲染,优先执行这个脚本,待执行完这个脚本之后,再继续渲染
<script src="path/to/myModule.js" defer></script>
<script src="path/to/myModule.js" async></script>

加载规则

浏览器加载ES6模块,也使用<script>标签,但是要加入【type="module"】属性

浏览器对于带有type="module"<script>,都是异步加载,不会造成浏览器堵塞,等同于使用了<scipt>标签的defer属性

<script type="module" src="./foo.js"></script>
<!-- 等同于 -->
<script type="module" src="./foo.js" defer></script>

注意

对于外部的模块脚本,有下面几点需要注意:

  • 代码是在模块作用域之中运行,而不是在全局作用域中运行,模块内部的顶部变量,外部不可用
  • 模块脚本自动采用严格模式,不管有没有声明use strict
  • 模块之中,顶层的this关键字返回undefined,而不是指向window,也就是说在模块顶层使用this关键字,是无意义的

顶部变量外部不可用

<body>
	<script type="module">
		var x = 10;
	</script>
	<script>
		var y = 10;
	</script>
	<script>
		console.log(y); // 10
		console.log(x); // 报错,x未定义
	</script>
</body>

效果:

this关键字返回undefined

<body>
	<script type="module">
		console.log("这是module模块:",this);
	</script>
	<script>
		console.log("这是普通模块:",this);
	</script>
</body>

效果:

JavaScript的循环加载

循环加载指的是:

a脚本的执行依赖b脚本,而b脚本的执行有依赖a脚本

这就造成了“强耦合”,还可能导致递归加载(在其它编程语言如Python中,会报错)

但实际上,循环加载是不可避免的,为此ES6标准作出如下规定:

ES6模块的循环加载

ES6模块动态引用,如果使用import从一个模块加载变量,那些变量不会被缓存,而是成为一个指向被加载模块的引用

// a.mjs
import {bar} from './b';
console.log('a.mjs');
console.log(bar);
export let foo = 'foo';
// b.mjs
import {foo} from './a';
console.log('b.mjs');
console.log(foo);
export let bar = 'bar';

结果:

b.mjs
ReferenceError: foo is not defined

下面我们来分析一下执行过程:

首先执行a.mjs以后,引擎发现它加载了b.mjs,因此会优先执行b.mjs,然后再执行a.mjs

接着,执行b.mjs的时候,已知它从a.mjs输入了foo接口,这时不会去执行a.mjs,而是认为这个接口已经存在了,继续往下执行

执行到console.log(foo)的时候,才发现这个接口根本没定义,因此报错

解决办法:

使用函数代替变量表达式(函数具有提升效果)

// a.mjs
import {bar} from './b';
console.log('a.mjs');
console.log(bar());
function foo() { return 'foo' }
export {foo};
// b.mjs
import {foo} from './a';
console.log('b.mjs');
console.log(foo());
function bar() { return 'bar' }
export {bar};
  • 但是如果把函数改写成函数表达式,仍然会报错(函数表达式也是表达式,没有提升效果)
// a.mjs
import {bar} from './b';
console.log('a.mjs');
console.log(bar());
const foo = () => 'foo';
export {foo};

块级作用域

let取代var

ES6提出的let和const,其中let可以完全取代var,因为两者语义完全相同,而且let没有副作用(var命令存在变量提升效果,let命令没有这个问题)

'use strict';
if (true) {
  let x = 'hello';
}
for (let i = 0; i < 10; i++) {
  console.log(i);
}

上面代码如果用var代替let,实际上就声明了两个全局变量

变量应该只在声明的代码块内有效

全局变量和线程安全

letconst之间,建议优先使用const,尤其是在全局环境,不应该设置变量,只应设置常量

const优于let的原因:

  • 提醒代码阅读者,这个变量不能修改
  • 复合函数时编程思维,运算不改变值,只是新建值
  • JavaScript编译器会对const进行优化
// bad
var a = 1, b = 2, c = 3;
// good
const a = 1;
const b = 2;
const c = 3;
// best
const [a, b, c] = [1, 2, 3];
学习webpack是为了掌握前端代码打包工具的使用。随着前端工程化的发展,webpack已经成为了前端开发中最常用的打包工具之一。学习webpack可以帮助我们对项目的模块化管理、代码压缩与优化、资源加载等方面进行更加灵活和高效的处理。 这篇文章主要介绍了webpack的基础知识和使用方法。首先,它解释了webpack的基本概念,如入口和出口文件、loader和plugin等。然后,它详细介绍了如何配置webpack的各个参数和插件,包括如何使用Babel处理ES6语法,如何使用Less或Sass处理CSS,如何使用图片压缩插件等。 接着,文章讲解了webpack的打包原理和优化技巧。它介绍了webpack的模块化加载机制,以及如何使用Code Splitting和Dynamic Import等功能来提高页面加载速度。同时,它还提到了如何使用webpack进行代码分割和缓存优化,以及如何使用Tree Shaking和代码压缩插件来减小项目的体积。 最后,文章介绍了webpack的常见问题和解决方法。它列举了一些常见的错误和警告信息,并提供了相应的解决方案。此外,它还提供了一些常用的webpack插件和工具的推荐,帮助我们更好地进行前端开发。 总的来说,这篇文章提供了一个很好的入门教程,可以帮助我们快速掌握webpack的基本概念和使用方法。但是,要想在实际项目中灵活应用webpack,还需要深入学习官方文档和相关资料,并结合实际项目进行实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是洋洋a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值