2016-11-20 5 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。それは、問題のフィールドのargsをページ上部の不変の宣言から取得します。関数に渡されたsettingsにラベルがある場合は、変数をmyArgs変数に追加します。その後、関数を終了するために戻る前に、私はmyArgsをクリアします。

labelmyArgsで、それがその後のsettingsによって渡されていなくても、それはsettingsに渡された最初の時、後に毎回表示されます。

EDIT FTR、labelmyArgs又はfields[field]で印刷されることはありません。後者には存在せず、印刷時には存在してはならない。

* UPDATE * フィドル:https://jsfiddle.net/Lxqvt6mk/2/

+1

Thom、コードが機能しません。実行可能なコードを貼り付けます。スニペットを使用します。 –

+0

時間を節約するために問題の簡略化されたバージョンを書くときに、誤って '&& 'の代わりに'と 'をタイプしました。私は 'html'を定義するのを忘れていました。なぜなら、それは私の '// htmlの書き込み 'のコメントの中に含まれていたからです(再びあなたの時間を節約するため)。ここでは、私の問題を正確に示しているjsフィドルがあります。これは、2つの訂正を行った後です:https://jsfiddle.net/Lxqvt6mk/2/ –

答えて

0

あなたはmyArgsfields.dateを割り当て、あなたがmyArgsを変更します。 myArgsを変更する場合は、が参照されているため、fields.dateが変更されています。それはオブジェクトです。それを変数に代入すると、コピーされません。あなたはちょうどメモリ内の非常に同じオブジェクトへの参照を2つ持っています。関数の呼び出しの前後に、fieldsの値を比較することができます。

次回は貼り付け前にコードを確認してください。最適な解決策は、実行可能なスニペットを挿入することです。

幸運を祈る!

関連する問題