2012-06-25 2 views
1

Я буквально пытался отладить это в течение целого дня, и это совершенно изумительно. ища некоторые намеки.Объект Javascript, инициализированный странными значениями

я эти функции внутри яваскрипта имен:

var ZZ = { 
    bar: function(data) { 
    console.log(data); 
    }, 
    foo: function() { 
    $.ajax({ 
     'url':'/test', 
     'type':'GET', 
     'dataType':'jsonp', 
     'success':function(ret_json, status) { 
     console.log(ret_json); // SUCCESS_1 
     console.log(ret_json[1].title); //SUCCESS_2 
     bar(ret_json); 
     } 
    }); 
    }, 
... 
} 

так я смотрю на вкладке «чистой» инструментов разработчика и JSON вернулся правильна .. что-то вроде:

[{'id':1, 'url':'http://a.com', 'title':'hi'}, {'id':2, 'url':'http://b.com', 'title':'hi2'}] 

теперь я смотрю на консоль и вижу, что на SUCCESS_1 он выдает что-то вроде:

[{'id':1, 'url':'http://c.com', 'title':'hi3'}, {'id':2, 'url':'http://c.com', 'title':'hi3'}] 

as вы можете видеть, что идентификатор верен, но URL-адрес и название - нет. (я также могу изменить идентификаторы в базе данных, и они будут корректно перенесены)

затем следующая строка на SUCCESS_2, она захватывает правильный заголовок! 'hi2'

следующий я положил инструкцию отладчика в функцию успеха: ret_json выглядит абсолютно правильно, но когда я вхожу в функцию bar(), данные снова выглядят неправильно.

следующий я добавлю:

var hi = {}; 
console.log(hi); 

в функцию успеха .. он печатает .. (не шучу)

{'url':'http://c.com', 'title':'hi3'} 

так в основном, это "по умолчанию" будет перезаписывать все, что было на самом деле там ,

Я добавил кэш: false для вызова ajax, я пробовал json и jsonp, i'v попытался очистить кеш, я пробовал использовать chrome/safari/firefox .. но ничего не делаю, и я сомневаюсь, что это что-то очевидное ... это действительно действительно испуганно.

любые другие идеи, что я могу попробовать?


ОБНОВЛЕНИЕ: добавление этого пространства имен на другой странице HTML. самого вопиющий пример

var hi = {} 
console.log(hi) 

печать материал исчез но оригинальная проблема ret_json, имеющую неправильные данные по-прежнему присутствует. (у меня до сих пор нет доступа к рабочей версии предыдущей страницы html)

+0

Дело в том, что console.log (hi) определенно странно, ничего не могу сказать об этом сразу, но попытались ли вы удалить все внешние скрипты, кроме jquery и вашего сценария? Кроме того, попробуйте запустить ту же короткую часть кода в консоли ... –

+0

Да, этот вызов ajax отлично работает, если я переместил его на страницу сам по себе .. это определенно какое-то странное взаимодействие с чем-то другим в моей текущей среде javascript ... просто не уверен, где я должен смотреть. – ggez44

+0

Это как-то связано с одинарными кавычками в вашем JSON? – veritasetratio

ответ

2

@ ggez44, это связано с тем, что console.log не является синхронизированным вызовом в Chrome/Firefox/Safari. Обычно существует задержка в несколько мс.

Оглядываясь на мою машину, задержка не постоянна и составляет от 4 мс до 16 мс в Chrome и около 2 мс в Safari.

http://techblog.appnexus.com/2011/webkit-chrome-safari-console-log-bug/

Bizarre console.log behaviour in Chrome Developer Tools

Мой спекулятивный решение это сделать что-то вроде "console.log (a.toJSON());". Затем вы получаете указатель на переданный в строковый объект, который не привязан к исходному объекту.

Обновление: По-видимому, это «функция, а не ошибка». Есть несколько вполне приличных ссылок на билеты в списке рассылки webkit. Why does javascript object show different values in console in Chrome, Firefox, Safari?

+0

wow yeah я полностью настраивал его на значения «по умолчанию» в функции «bar». (был сгенерирован так, что grep не попал) .. но так как это было после моих вызовов console.log, я даже не стал смотреть. Кроме того, он не полностью работает в Firefox либо .. консоль регистрирует нужные объекты, но если вы нажмете на детали этих объектов, данные снова будут переадресованы во времени. – ggez44

+0

Отличная находка! Спасибо, Алекс, мне тоже было любопытно! –

1

Добавил ли вас в любом месте вашего кода следующее:

Object.prototype.url = "http://c.com"; 
Object.prototype.title = "hi3"; 

Это единственная причина, по которой эти свойства будут отображаться при создании пустого объекта.

+0

+1; @ ggez44 Чтобы проверить это, запустите 'console.log (Object.prototype)' и посмотрим, присутствуют ли эти свойства. – apsillers

+0

спасибо, я сделал greps для оскорбительных данных, но ничего не нашел, но я попробую распечатать прототип объекта ... что-то еще сломалось в моей ветке, но скоро вернется с результатом. большое спасибо! – ggez44

+0

nope .. ничего особенного в прототипе. проверил Object.prototype, а также посмотрел на прототип экземпляра (экземпляр, который имеет странные значения) – ggez44

Смежные вопросы