2013-06-28 47 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