2014-07-07 63 views
0

下面是來自節點url模塊源代碼片段。在定義有效之前如何使用函數?

var punycode = require('punycode'); 
var util = require('util'); 

exports.parse = urlParse; 
exports.resolve = urlResolve; 
exports.resolveObject = urlResolveObject; 
exports.format = urlFormat; 

exports.Url = Url; 

function Url() { 
    this.protocol = null; 
    this.slashes = null; 
    this.auth = null; 
    this.host = null; 
    this.port = null; 
    this.hostname = null; 
    this.hash = null; 
    this.search = null; 
    this.query = null; 
    this.pathname = null; 
    this.path = null; 
    this.href = null; 
} 

正如您所看到的,'Url'在函數'Url'被定義之前使用。 據我所知這不是有效的JavaScript,但它工作正常。

有人能告訴我爲什麼這是好的嗎?爲什麼節點作家喜歡這個約定?

編輯:謝謝。我沒有理解'功能提升',因爲前一個標題是錯誤的問題,已修改。

+1

功能declerations始終懸掛在JavaScript範圍的頂端,所以它是完全有效的。 – adeneo

+0

http://designpepper.com/blog/drips/variable-and-function-hoisting ...如果它是無效的,沒有人會寫這樣的代碼。既然它有效,它必須是有效的。 –

回答

1

像'function a(){}'這樣的函數將被定義,即使它放在後面。 像'var a = function(){}'這樣的函數將被定義爲正常變量定義順序。 檢查這個代碼:

alert(a); 
function a(){} 

alert(b); 
var b = function(){} 

http://jsfiddle.net/j4v7E/

+0

如果我有'var a = function b(){}'會怎麼樣?這兩個規則現在適用嗎? –

+0

@FelixKling NO,b在這裏將被忽略,它和'var a = function(){}'一樣' – TomWan

相關問題