2016-10-13 9 views
1

私はローカル変数を持つ再帰関数を持っています。 特定の条件で自分自身を呼び出します。 ローカル変数は更新する必要がありますが、すべての呼び出しは現在の関数スコープに固有の新しいローカル変数を作成します。 どのように私はすべての再帰的なループにアクセスし、新しいものを作成しないためにローカル変数に到達できますか? __Callee.varnameのようなもの?再帰的ループのためにJavascriptローカル変数をグローバルにする

コードは次のとおりです。

var addAttribute = function(object,elem) 
{ 
    var attributes = []; 

    // only attribute without values 
    if (object instanceof Array) 
    { 
     for (var value in object) 
     { 
      attributes.push(object[value]); 
     } 
    } 
    // attribute with values 
    else if (object instanceof Object) 
    { 
     for (var key in object) 
     { 
      if (object[key] instanceof Array) 
      { 
       addAttribute(object[key],elem); 
      } 
      else 
      { 
       attributes.push(key+'=\''+object[key]+'\''); 
      } 
     } 
    } 
    // Only one attribute 
    else if (typeof object === 'string') 
    { 
     attributes.push('\''+object+'\''); 
    } 
    // Invalid parameter 
    else 
    { 
     console.log('Invalid parameter: '+typeof object); 
    } 

    console.log('<'+elem+' '+attributes.join(' ').toString()+' />'); 

} 

私は理由はすでに他の機能とグローバルスコープでこの名前を使用してのグローバルに変数を作成する必要はありません。

答えて

1

、呼び出し元の関数属性は、呼び出された関数の属性に設定することができないので、それは文句を言わない仕事

function fn() { 
    function recursiveFunction() { 
     // do something with x 
     recursiveFunction(); 
    } 
    var x = 0; 
    recursiveFunction(); 
} 
1

いつもの事はおそらく、必要に応じて、機能にそれを渡すことです:

var addAttribute = function(object,elem, attributes) { 
    attributes = attributes || []; 
    // .... 

再帰的に呼び出すときに続いて、第三引数に渡す:

addAttribute(object[key], value, attributes); 

はここで実証ずっと簡略化した例です:

function foo(num, array) { 
 
    array = array || []; 
 
    array.push(num); 
 
    console.log("Pushed " + num + ", array = " + JSON.stringify(array)); 
 
    if (num < 5) { 
 
    foo(num + 1, array); 
 
    } 
 
} 
 
foo(1);

+0

クロージャを使用してください。 –

+0

@NémethPeter:申し訳ありませんが、「呼び出し元関数属性」または「呼び出された関数属性」の意味を理解できません。上記は、Ninaの答えの中の共有された 'x'のように、単一の共有配列を使用します。 –

関連する問題