2013-06-28 74 views
1

我有以下代碼:jQuery變量作用域?說未定義

function postToDrupal(contacts, source, owner) { 
    (function ($) { 

    var contact, name, email, entry; 
    emails = {}; 

    for (var i = 0; i < contacts.length; i++) { 
     contact = contacts[i]; 
     emails[i]['name'] = contact.fullName(); 
     emails[i]['email'] = contact.selectedEmail(); 
    } 

    $.post("/cloudsponge-post",emails,function(data) { 

    }); 
    }(jQuery)); 
} 

我收到以下錯誤,當我嘗試並運行它:

WARN: Attempt to invoke callback [afterSubmitContacts] failed: TypeError: Cannot set property 'name' of undefined 

我不知道這個問題是 - 什麼我很新的JS和發現它有點棘手。它破裂的原因是什麼,我該如何解決它?

+1

您的電子郵件在一個對象中,而不是一個數組,所以電子郵件[i]是未定義的。你也忘了它之前的變種。 – Virus721

+2

我記得在設置對象屬性之前被迫做= {},所以我認爲它是相同的數組。 – Virus721

+0

請注意,如果我問爲什麼直接在函數中使用IIFE?該函數創建它自己的範圍。它是否與使用'$'變量的Drupal相關? – Jasper

回答

3

有一堆你可以寫這段代碼的方式,但我個人會這樣做:

function postToDrupal(contacts, source, owner) { 
    // TODO: source and owner are unused 

    var emails = jQuery.map(contacts, function(contact) { 
     return { 
      name: contact.fullName(), 
      email: contact.selectedEmail() 
     } 
    }); 

    jQuery.post('/cloudsponge-post', emails, function(data) { 
     // ... 
    }); 
} 
2

該對象emails[i]尚未定義。試試這種方式:

for (var i = 0; i < contacts.length; i++) { 
    contact = contacts[i]; 
    emails[i] = {}; //Instantiate it here 
    emails[i]['name'] = contact.fullName(); 
    emails[i]['email'] = contact.selectedEmail(); 
} 
+0

我不會使用對象來存儲列表。我建議將'emails'聲明更改爲一個數組。 –

+1

@MarlonBernardes:他有字符串鍵。它需要成爲一個對象。爲什麼他應該使用數組? – mpen

+2

@Mark其實我指的是「外部」數據結構。他需要一組對象。看到我的帖子下面。 –

0

我懷疑你想要一個數組而不是一個對象。所以你應該將emails = {}更改爲emails = []

如果作爲@PSL建議你將與一個像這樣的對象結束(這是不是一個數組):

{ 
    0: { 
    name: 'john' 
    email: '[email protected]' 
    }, 
    1: { 
    name: 'lennon' 
    email: '[email protected]' 
    } 
} 

一個可能的解決方案:

var contact, name, email, entry, 
    emails = []; 

for (var i = 0; i < contacts.length; i++) { 
    contact = contacts[i]; 
    emails.push({name: contact.fullName(), email: contact.selectedEmail()}); 
} 

最終你會與此:

[ 
    { 
    name: 'john' 
    email: '[email protected]' 
    } 
    ,{ 
    name: 'lennon' 
    email: '[email protected]' 
    } 
] 
+1

你忘了分號,質量差的副本;-) – Virus721

+0

我沒有複製你的文章 - 和分號不需要的方式:) –

+0

@MarlonBernardes推出了一種很好的做法。 – PSL