<p><strong>一,开篇分析</strong></p>
<p>在上个章节中我们学习了NodeJS的基础理论知识,对于这些理论知识来说理解是至关重要的,在后续的章节中,我们会对照着官方文档逐步学习里面的各部分模块,好了该是本文主角登台亮相的时候了,Global</p>
<p><img alt="" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-57bbee9ef2d4555b2910eed53363c662.png"></p>
<p>让我们来看一下官方的定义:</p>
<p>Global Objects全局对象These objects are available in all modules. Some of these objects aren't actually in the global scope but in the module scope - this will be noted.<br>
</p>
<p>这些对象在所有的模块中都可用。实际上有些对象并不在全局作用域范围中,但是在它的模块作用域中------这些会标识出来的。</p>
<p>In browsers, the top-level scope is the global scope. That means that in browsers if you're in the global scope<code>var something</code>will define a global variable.</p>
<p>In Node this is different. The top-level scope is not the global scope;<code>var something</code>inside a Node module will be local to that module.</p>
<p>全局对象这个概念我想大家应该不会感到陌生,在浏览器中,最高级别的作用域是Global Scope ,这意味着如果你在Global Scope中使用 "var" 定义一个变量,这个变量将会被定义成Global Scope。</p>
<p>但是在NodeJS里是不一样的,最高级别的Scope不是Global Scope,在一个Module里用 "var" 定义个变量,这个变量只是在这个Module的Scope里。</p>
<p>在NodeJS中,在一个模块中定义的变量,函数或方法只在该模块中可用,但可以通过exports对象的使用将其传递到模块外部。</p>
<p>但是,在Node.js中,仍然存在一个全局作用域,即可以定义一些不需要通过任何模块的加载即可使用的变量、函数或类。</p>
<p>同时,也预先定义了一些全局方法及全局类Global对象就是NodeJS中的全局命名空间,任何全局变量,函数或对象都是该对象的一个属性值。</p>
<p>在REPL运行环境中,你可以通过如下语句来观察Global对象中的细节内容,见下图:</p>
<p><img alt="" src="https://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-6b9b28996566063217b90e79ae7f2bd2.png"></p>
<p>我在下面会逐一说说挂载在Global对象上的相关属性值对象。</p>
<p></p>
<p>(1),Process</p>
<p> process {Object} The process object.See the process object section.</p>
<p> process {对象} 这是一个进程对象。 在后续的章节中我会细说,但在这里我要先拿出一个api来说一下。</p>
<p> process.nextTick(callback)</p>
<p> On the next loop around the event loop call this callback. This is not a simple alias to setTimeout(fn, 0), it's much more efficient. It typically runs before any other I/O events fire, but there are some exceptions. See process.maxTickDepth below.<br>
</p>
<p> 在事件循环的下一次循环中调用 callback 回调函数。这不是 setTimeout(fn, 0) 函数的一个简单别名,因为它的效率高多了。</p>
<p> 该函数能在任何 I/O 事前之前调用我们的回调函数。如果你想要在对象创建之后而I/O 操作发生之前执行某些操作,那么这个函数对你而言就十分重要了。</p>
<p> 有很多人对Node.js里process.nextTick()的用法感到不理解,下面我们就来看一下process.nextTick()到底是什么,该如何使用。</p>
<p></p>
<p> Node.js是单线程的,除了系统IO之外,在它的事件轮询过程中,同一时间只会处理一个事件。你可以把事件轮询想象成一个大的队列,在每个时间点上,系统只会处理一个事件。</p>
<p> 即使你的电脑有多个CPU核心,你也无法同时并行的处理多个事件。但也就是这种特性使得node.js适合处理I/O型的应用,不适合那种CPU运算型的应用。</p>
<p> 在每个I/O型的应用中,你只需要给每一个输入输出定义一个回调函数即可,他们会自动加入到事件轮询的处理队列里。</p>
<p> 当I/O操作完成后,这个回调函数会被触发。然后系统会继续处理其他的请求。</p>
<p></p>
<p> </p>
<p> 在这种处理模式下,process.nextTick()的意思就是定义出一个动作,并且让这个动作在下一个事件轮询的时间点上执行。我们来看一个例子。例子中有一个foo(),你想在下一个时间点上调用他,可以这么做:</p>
<p></p><div class="codetitle"><span><a class="copybut" data="70467" id="copybut70467"><u>复制代码</u></a></span> 代码如下:</div><div class="codebody" id="code70467"><br>
function foo() {<br>
console.error('foo');<br>
}<br>
<br>
process.nextTick(foo);<br>
console.error('bar');<br>
</div>
<p>运行上面的代码,你从下面终端打印的信息会看到,"bar"的输出在“foo”的前面。这就验证了上面的说法,foo()是在下一个时间点运行的。</p>
<p></p><div class="codetitle"><span><a class="copybut" data="62181" id="copybut62181"><u>复制代码</u></a></span> 代码如下:</div><div cla |
|