2016-11-20 4 views
-2
var fields = {date:{type:'date'}};  
var createField = function(field, settings) 
{ 
    var myArgs = {}; 
    myArgs = fields[field]; 
    console.log(fields[field]); 
    console.log(myArgs); 
    console.log(settings); 
    if('label' in settings && settings.label) myArgs.label = settings.label; 
    // write html 
    var html = ''; 
    myArgs = null; 
    return html; 
} 
var type = 'date'; 
createField(type, {label:'Date of Birth'}); 
// log prints no "label" in fields[field] or myArgs, but does in settings 
createField(type, {}); 
// log prints label of "Date of Birth" in both fields[field] and myArgs, but not in settings 

WTF?свойства объекта не очищаются

Другими словами, моя функция создает переменную с нуля, которую я не использую нигде в моем коде: myArgs. Он захватывает аргументы для рассматриваемого поля из неизменной декларации в верхней части страницы. Если settings, переданный функции, имеет метку, она добавляет метку к переменной myArgs. Затем, прежде чем вернуться, чтобы выйти из функции, я очищаю myArgs.

label показывает в myArgs каждый раз после того, как первый раз она прошла в settings, даже если она не передается последующим settings.

EDIT FTR, label никогда не должны быть напечатаны в myArgs или fields[field]. Он не существует в последнем и не должен существовать YET во время печати в первом.

* UPDATE * Fiddle: https://jsfiddle.net/Lxqvt6mk/2/

+1

Thom, ваш код не работает. Вставьте исполняемый код. Используйте фрагмент. –

+0

Я случайно набрал 'и' вместо' &&' при написании упрощенной версии проблемы, чтобы сэкономить ваше время. Я также забыл определить 'html', потому что он был включен в мой комментарий' // write html' (опять же, чтобы сэкономить ваше время). Вот сценарий js, который точно демонстрирует мою проблему, после внесения этих минимальных поправок: https://jsfiddle.net/Lxqvt6mk/2/ –

ответ

0

Вы назначаете fields.date к myArgs а затем изменить myArgs. Изменяется myArgs изменяется fields.date с maArgs относится к нему. Это объект. Когда вы назначаете его переменной, она не копируется. У вас есть только две ссылки на один и тот же объект в памяти. Вы можете сравнить значение fields до и после вызова вашей функции.

В следующий раз, пожалуйста, проверьте свой код перед вставкой. Лучшим решением является вставка исполняемого фрагмента.

Удачи вам!

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