0

在 nodejs 中需要模块时声明变量的最佳方法是什么?不同的知名节点开发者遵循不同的风格。例如,TJ Holowaychuk 使用这种风格:

(method1)
var connect = require('connect')
  , Router = require('./router')
  , methods = Router.methods.concat('del', 'all')
  , middleware = require('./middleware')
  , View = require('./view');

另一方面,Ryan Dahl 更喜欢这种方式:

(method2)
var express = require('express');
var socketio = require('socket.io');
var bench = require('./bench');

注意:我的问题不是关于样式(这已在本要点中广泛讨论),而是关于这两种方法中的哪一种产生最优化的代码(如果特定于需要模块的情况,则加分)。我知道差异不会太大,但我相信这是值得了解的。例如,在 C++ 中,这个问题得出的结论是,构建过程将从要解析的较少字符中受益一点。除此之外,一种方法比另一种方法还有其他优势吗?

4

1 回答 1

3

...这两种方法中的哪一种产生最优化的代码...

如果 V8 在编译源代码(调试信息除外)时产生的实际机器代码存在差异,我会感到惊讶。我无法相信字符数的差异会对现实世界产生任何影响,事实上,一个使用逗号运算符生成单个语句来连接多个表达式,另一个生成一系列语句(一个表达式/语句)。这真的只是一种风格。

为了这:

// Style 1
var express = require('express')
  , socketio = require('socket.io')
  , bench = require('./bench');

引擎实际上处理这个:

// Style 1
var express, socketio, bench;
express = require('express'),
socketio = require('socket.io'),
bench = require('./bench');

...例如,声明后跟由逗号运算符连接的三个赋值表达式组成的单个语句。

为了这:

// Style 2
var express = require('express');
var socketio = require('socket.io');
var bench = require('./bench');

引擎实际上处理这个:

// Style 2
var express, socketio, bench;
express = require('express');
socketio = require('socket.io');
bench = require('./bench');

...例如,声明后跟三个语句,每个语句都有一个赋值表达式。

在这两种情况下,声明步骤都完全从初始化中删除,这实际上是赋值。进入上下文后,所有用var(和所有函数声明)声明的变量都会在执行上下文的词法环境的绑定对象中创建条目,然后再运行任何分步代码。这就是为什么它们有时被称为“提升”的原因,也是为什么上述样式在很大程度上与引擎无关的原因。(更多:可怜的误解var

一旦声明被分解,就结果语句的差异而言,我怀疑机器代码是否存在任何真正的差异。

于 2013-07-15T05:41:14.083 回答