在nodejs中需要模块时,声明变量的最佳方法是什么?不同的知名节点开发人员遵循different styles。例如,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');
注意:我的问题不是关于样式(已在this gist中广泛讨论),而是关于这两种方法中的哪一种产生最优化的代码(如果具体的话,可以使用奖励积分)对于需要模块的情况)。我知道差别不大,但我相信值得了解。例如,在C ++中,this question得出结论,构建过程将从要解析的较少数量的字符中获益。除此之外,一种方法还有其他优势吗?
答案 0 :(得分: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
声明的所有变量(以及所有函数声明)在执行上下文的词法环境的绑定对象中创建条目,然后在任何步骤之前步骤代码正在运行。这就是他们有时被称为“悬挂”的原因,也是为什么上述款式与发动机无关。 (更多:Poor misunderstood var
)
就一旦声明被分解后,结果语句的差异而言,我怀疑机器代码是否存在任何真正的差异。