2011-11-07 32 views
4

通過jsHint傳遞這樣的代碼:js提示「函數未定義」問題,函數聲明的順序很重要?

var A = function (spec) { 
    "use strict"; 
    var a = function() { 
    return b(); 
    }; 

    var b = function() { 
    return 5; 
    }; 

    a(); 
}; 

返回此錯誤:

Line 4: return b(); 
'b' is not defined. 

我理解這可能與 「提升」 爲解釋在這裏做:JavaScript function order: why does it matter?

但是,以下代碼返回相同的錯誤:

var A = function (spec) { 
    "use strict"; 
    function a() { 
    return b(); 
    } 

    function b() { 
    return 5; 
    } 

    a(); 
}; 

如果我理解正確,至少第二個代碼片段不應該返回錯誤。我錯了嗎?

即使考慮起升機構,我還是不明白爲什麼第一個代碼段應該是錯誤的。函數a僅在函數b被定義後才被調用,所以b將在a的關閉中。我的代碼是錯的還是jsHint錯了?

據我所知,這個問題是純學術性的,因爲代碼將按預期在所有的瀏覽器。不過,我想知道爲什麼jsHint拋出一個錯誤。

回答

4

這是jsLint中的一個誤報。
你的兩個代碼片段都能正常工作。

忽略警告。

+0

我不知道爲什麼jsLint(及其fork)忽略函數聲明提升。 – SLaks

+0

我認爲這是由他們的github中的幾個問題:[61](https://github.com/jshint/jshint/issues/61),[47](https://github.com/jshint/jshint/issues/47),[29](https://github.com/jshint/jshint/issues/29)。 [29](https://github.com/jshint/jshint/issues/29)於2011年3月關閉,並表示該問題已修復(無論如何都在其主分支中)。 – jonemo

0

jsHint正試圖通過指出潛在的問題和非傳統的代碼,以幫助您。

在這種情況下,它並不高興,因爲這可能是困難的人的理解 - 即使它是完全有效的JavaScript。

2

第一個例子是一個提升的問題,因爲()引用B檢查被聲明之前()。解決方案是'var a,b''在你「嚴格使用」之後;聲明。