JavaScript对象属性在控制台中可见,但未定义?

问题描述:

我很难搞清楚如何访问Javascript中的对象属性。我有一个返回对象的功能,我可以看到,对象和它的所有属性,当它被记录在Safari中控制台,但我不能代表其他功能获得的属性值。例如,试图警告其中一个属性返回'undefined'。JavaScript对象属性在控制台中可见,但未定义?

,其生成对象


getProfile : function() { 

    FB.api('/me', function(response) { 
    facebook.profile.user_id = response.id; 
    facebook.profile.name = response.name; 
    facebook.profile.firstName = response.first_name; 
    facebook.profile.lastName = response.last_name; 
    facebook.profile.gender = response.gender; 
    }); 

    FB.api('/me/photos', {limit: 8}, function(response) { 
    facebook.profile.numPhotos = response.data.length; 
    for (key in response.data) { 
     var photoUrl = response.data[key].source; 
     eval('facebook.profile.photo' + key + '= photoUrl'); 
    } 
    }); 

    return facebook.profile; 
} 

试图使用该函数在另一个脚本

 
function loadProfile() { 
    var profile = facebook.getProfile();

console.log(profile); alert(profile.name); }

的功能的功能getProfile调用FB API函数FB.api,其执行一个asynchoronous HTTP请求。在你loadProfile功能打电话给你打电话getProfile其立即返回未填充数据又因为HTTP请求尚未完成facebook.profile对象。

考虑以下变化:

getProfile : function(fCallback) { 
    var bInfo = false, 
     bPhotos = false;  

    FB.api('/me', function(response) { 
    facebook.profile.user_id = response.id; 
    facebook.profile.name = response.name; 
    facebook.profile.firstName = response.first_name; 
    facebook.profile.lastName = response.last_name; 
    facebook.profile.gender = response.gender; 

    bInfo = true; 
    if (bPhotos) 
     fCallback(facebook.profile); 
    }); 

    FB.api('/me/photos', {limit: 8}, function(response) { 
    facebook.profile.numPhotos = response.data.length; 
    for (key in response.data) { 
     var photoUrl = response.data[key].source; 
     eval('facebook.profile.photo' + key + '= photoUrl'); 
    } 

    bPhotos = true; 
    if (bInfo) 
     fCallback(facebook.profile); 
    }); 
} 

,并调用此函数现在通过以下方式:

function loadProfile() { 
    facebook.getProfile(function (profile) { 
    alert(profile.name); 
    }); 
} 

为什么OU可以在控制台中看到领域的原因是因为你的非同步后反思的对象调用已成功执行。然而,警报调用立即在尚未填充的对象上的相同线程中执行。

虽然“谢尔盖Ilinsky”可能会考虑一个合适的理由,但也有更多的东西,可以考虑。通常由错误的,并且难以调试来。

有时它恰巧,你的对象键包含空格,让说:

var myObj = new Object(); 

myObj['key1'] = 'val1'; 
myObj['key2'] = 'val2'; 
myObj['key3 '] = 'val3'; //the key contains spaces here 
myObj['key4 '] = 'val4'; // the key contains spaces here 

所以,当你登录它通过console.log(myObj)安慰,你会得到:

Object { key1="val1", key2="val2", key3 ="val3", key4 ="val4"} 

但当你访问:

alert(myObj.key1); //Ok: val1 
alert(myObj.key2); //Ok: val2 

alert(myObj.key3); //undefined 
alert(myObj.key4); //undefined 

alert(myObj['key3']; //undefined 
alert(myObj['key4']; //undefined 

这些是错误的常见领域,其中一个错误放空间,可同时做复制粘贴,恰巧,那人说,console log能够表现出来,但我不能访问它。