在 Linux 的 shell 命令或者脚本中,我们经常看到这样的命令:
2> /dev/null
这是何意?
在 Linux 的 shell 命令或者脚本中,我们经常看到这样的命令:
2> /dev/null
这是何意?
我们在 Linux 的命令行里面会用到exit
,比方说退出某个 shell。在 shell 脚本中这个命令可以终止脚本的执行。exit
后面是可以接一个数字表示退出时候的状态。
在exports 和 module.exports这篇博客中,我们详细解释了在 CommonJS 规范中exports
和module.exports
的区别。本篇博客将讨论 CommonJS 规范和 ES6 规范模块导出之间的关系。
ES6 导出模块一般会使用export
或export default
,使用两者的语法在 javaScript 文档中的ES6 Module已经做了详细的讲解,此处不再赘述。那么为什么已经有了export
还要整个export default
呢?export
和export default
之间的关系是什么呢?下面的内容也将通过这两个问题进行展开。
在 ES6 模块中,如果模块导出中使用export var name = 'Robbie'
,那么在导入改模块的时候,导入的变量必须与之相对应,即import {name} form Info
。而export default name
在模块导入时的导入变量的命名可是任意的import myName form Info
。对比两者来看使用export default
可能具有更高的灵活性,也更便于不熟悉该库的开发者进行开发。
我们知道浏览器是不支持 ES6 模块语法的,所以对于代码中的 ES6 模块一般是采用 Babel 转成 CommonJS 规范的代码。此时的代码虽然浏览器仍然不能执行,但是 Node 可以,因为 webpack 是基于 Node 构建的,所以我们可以通过 webpack 将代码打包成浏览器支持的 ES5 代码。
相比于 Web Service(网络服务),“本地服务”这个名词我们似乎更加的熟悉。本地服务通过本地的计算机环境为系统功能提供服务,完成某项特定的功能,使用期间不需要使用网络。而对应的 Web Service 则是利用网络调用其他网站的资源来实现系统的某项特定功能。
例如,当我们想在个人网站中添加一个显示天气的功能时,如果我们仅仅使用一些简单的前端组件显然是无法实现的。这项功能的数据可能不仅依赖于数据库的分析,甚至还需要卫星的探测等。此外,天气展示这项功能并不是我们这个网站中的核心功能,我们不会为了实现这项功能付出太多的开发成本。
图:360导航中的天气功能
于是乎,Web Service 就应运而生了。对于像在网页上显示天气、地图、Twitter 上的最新动态这类的非核心功能,我们不需要自己去开发,Web Service 就可以让我们的网站使用其他网站的资源。这些网络资源会向外界暴露出能够通过 Web 进行调用的 API,我们只需要调用这些 API,就可以拿到这些网络资源的数据。
A 同学创业需要启动资金,于是他决定去找马云爸爸借钱,可想而知,最后碰一鼻子灰回来了。情急之下,他想到一个办法,找关系开后门,经过一番消息打探,原来 A 同学的大学老师王老师是马云的同学,于是 A 同学找到王老师,托王老师帮忙去马云那借 500 万过来。
不过马云并不知道这钱是 A 同学借的,马云是借给王老师的,最后由王老师转交给 A 同学。这里的王老师在这个过程中扮演了一个非常关键的角色,就是代理,也可以说是正向代理。王老师代替 A 同学办这件事,这个过程中,真正借钱的人是谁,马云是不知道的,这点非常关键。
正向代理的过程中,服务器并不知道真正的客户端是谁,客户端的请求都是依靠代理服务器来请求。在我们访问谷歌的时候,会被防火墙阻止,此时我们需要购买一款可以翻墙的服务器,这个翻墙的服务器就扮演者正向代理的角色。
setTimeout()
会在确定的时间调用回调函数,且回调函数只会执行一次。
setInterval()
会重复调用一个函数,在每次调用之间具有固定的时间延迟。
为什么使用setTimeout
模仿setInterval
呢?这需要通过事件循环机制来解释,如果不清楚的话可以点击查看事件循环机制和浏览器内核相关内容。
由于setInterval
或setTimeout
不是 JS 中定义的,他们并不会在 JS 引擎线程中直接执行。当代码执行到setInterval
或setTimeout
时,事件循环机制会为setTimeout
或setInterval
开一个定时器线程并开始计时,等定义的时间过后,将回调函数放到回调队列里,等到函数调用栈空(JS
引擎线程空闲)时,将回调函数放入函数调用栈(使用 JS 引擎线程)执行。
浏览器事件循环经典题目:
for (var i=0; i<5; i++) {
setTimeout( function timer() {
console.log(new Date, i);
}, 1000);
}
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5
VM84:3 Wed Oct 09 2019 09:29:47 GMT+0800 (中国标准时间) 5
解析: 根据 setTimeout 定义的操作在函数调用栈清空之后才会执行的特点,for 循环里定义了 5 个 setTimeout 操作。而等待 1 秒后,任务队列里的 setTimeout 开始依次执行时,for 循环的 i 值,已经先一步变成了 5。因为任务队列推到函数调用栈执行的时间可以忽略不记(毫秒级),所以打印的 GMT 时间(精确到秒)和 i 的值都是相同的。
推荐指数:★★★☆☆
难度指数:★★★☆☆
出版时间:2018/6
作者:[US] Luis Atencio