2013-07-15 40 views
0

在nodejs中需要模塊時聲明變量的最佳方式是什麼?不同的着名節點開發人員遵循different styles。例如,TJ Holowaychuk使用此樣式:在nodejs中定義模塊變量的最佳方式是什麼?

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

瑞恩·達爾,而另一方面,更喜歡這種方式:

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

注意:我的問題是不是關於風格(已被覆蓋廣泛地在this gist中),而是關於兩種方法中的哪一種產生最優化的代碼(如果特定於需要模塊的情況,則爲獎勵點)。我瞭解這種差異不會太大,但我確實相信這是值得了解的。例如,在C++中,this question得出的結論是,構建過程將從較少的字符解析中受益。除此之外,一種方法還有其他優勢嗎?

+0

_「哪兩種方法產生最優化的代碼」_ - 通過什麼優化?優化在什麼意義上?另外,這兩個例子之間關係到你​​的本質區別是什麼?你問的只是一個'var'聲明與幾個? –

+0

@TedHopp在啓動變量時創建最少的執行開銷/內存使用量時進行了優化。是的,我在問幾個「var」。 – verybadalloc

回答

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'); 

... e.g,聲明接着由通過逗號運算符連接的三個賦值表達式的單個語句。

對於這一點:

// 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'); 

... e.g,該聲明後面三句話每一個賦值表達式。

在這兩種情況下,聲明步驟完全從初始化中刪除,這是真正的賦值。在進入上下文時,在運行任何分步代碼之前,用var(以及所有函數聲明)聲明的所有變量都會在執行上下文的詞彙環境的綁定對象中創建條目。這就是爲什麼他們有時會被稱爲「懸掛」的原因,以及爲什麼上面的風格與引擎無關。 (更多:Poor misunderstood var

並且就結果聲明的不同而言,一旦聲明被分解出來,我懷疑機器代碼中是否存在真正的差異。

+0

「進入上下文後,所有使用var(和所有函數聲明)聲明的變量都將在執行上下文的詞法環境的綁定對象中創建條目」:您知道對此的引用嗎?另外,感謝您的博客文章,這真的很有趣! – verybadalloc

+0

@verybadalloc:我應該把它和這個聯繫在一起,它由[規範的§10.5](http://www.ecma-international.org/ecma-262/5.1/#sec-10.5)覆蓋(真正可怕的規範-說話)。請享用。 :-) –

相關問題