2016-05-07 26 views
5

Mam dziwny problem z [].forEach w NodeJS.NodeJS []. Dla każdego niezdefiniowanego

(Korzystanie NodeJs v5.4.1)

tego kodu w funkcji

function _buildUserQuestionsForDisplay(question,callback){ 
    var res = {} 
    ["is_open","created","deleted","_id"].forEach(function(v){ 
     res[v] = question[v] 
    }) 
    ... 
    ... 
} 

rzuca błąd:

["is_open","created","deleted","_id"].forEach(function(v){

TypeError: Cannot read property 'forEach' of undefined

Działa jakbym zmiany kodu do

var arr = ["is_open","created","deleted","_id"]; 
arr.forEach(function(v){ 
    res[v] = question[v] 
}) 

Mam tes Ta sama funkcja działa na Chrome.console i działa pierwszy sposób.
Wiem, że oba przy użyciu silnika JS V8, jest to błąd lub coś, czego brakuje mi z reguły JavaScript?

dziękuję!

+1

Czy węzeł również zawiedzie z samodzielną wersją minimalną tego kodu? Czy używasz modułów, które mogą zmieniać 'Array.prototype' lub' Object.prototype'? – robertklep

+3

Jeśli wstawisz średnik po 'var res = {}' czy to działa? – Andy

+0

@Ayy, że mamy rację, czuję się głupio, kompilator JavaScript powinien wybaczyć, gdybym wstawił znak nowej linii, nie? –

Odpowiedz

3

Kod łamie jeśli nie masz średnik po tej linii:

var res = {} 

Aby zminimalizować te problemy dobrym pomysłem jest użycie LINTER jeśli nie używasz jednego. Zarówno JSHint, jak i ESLint można dodać jako wtyczki do edytora kodu (używam ESLint z arkuszem stylów Airbnb w SubmlimeText), a także można je dodać do przepływu pracy za pomocą Gulpa lub Grunta w celu wychwycenia tego rodzaju błędów przed zatwierdzeniem kodu.

If you choose to omit semicolons where possible, my advice is to insert them immediately before the opening parenthesis or square bracket in any statement that begins with one of those tokens, or any which begins with one of the arithmetic operator tokens "/", "+", or "-" if you should happen to write such a statement. - blog entry by Michaeljohn Clement 2010

+0

Dzięki! btw używam Visual Studio dla mac edytor (świetny edytor NodeJS dla mac, lepiej niż 9000% CPU NetBeans), ale może Microsoft zrobił coś złego z nowym znakiem linii, że kompilator nie będzie lubić –

+5

Myślę, że "jakiś powód" jest to, co kod wykonuje bez średnika, próbuje uzyskać dostęp do właściwości "_id" pustego obiektu, która jest oczywiście niezdefiniowana i nie ma metody forEach(). – nnnnnn

+0

@nnnnnn Jak zrozumiałem; mój kod robił następną rzecz (na przykład) '{a: 5} [" a "] // 5' i' {a: 5} ["b"] // undefined', i na tym byłem robienie forEach, co jest dokładnie tym, co opisałeś dla '_id' key –