在 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