Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使Javascript局部变量成为递归循环的全局变量_Javascript_Variables_Recursion_Scope - Fatal编程技术网

使Javascript局部变量成为递归循环的全局变量

使Javascript局部变量成为递归循环的全局变量,javascript,variables,recursion,scope,Javascript,Variables,Recursion,Scope,我有一个递归函数,它有一个局部变量。 它在特定条件下调用自己。 局部变量需要更新,但每次调用它都会创建一个特定于当前函数范围的新局部变量。 如何访问access all recursive循环的局部变量而不创建新循环? 类似于_Callee.varname 代码是: var addAttribute = function(object,elem) { var attributes = []; // only attribute without values if ( o

我有一个递归函数,它有一个局部变量。 它在特定条件下调用自己。 局部变量需要更新,但每次调用它都会创建一个特定于当前函数范围的新局部变量。 如何访问access all recursive循环的局部变量而不创建新循环? 类似于_Callee.varname

代码是:

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()+' />');

}

我不想将变量设为全局变量,因为在其他函数和全局作用域中已经使用了此名称。

通常的做法是将其传递到函数中,可能是可选的:

var addAttribute = function(object,elem, attributes) {
    attributes = attributes || [];
    // ....
然后递归调用时,传入第三个参数:

addAttribute(object[key], value, attributes);
下面是一个非常简单的示例,演示:

函数foonum,数组{ 数组=数组| |[]; array.pushnum; console.logpush+num+,array=+JSON.stringifyarray; 如果num<5{ foonum+1,数组; } }
foo1 通常是将其传递到函数中,可能是可选的:

var addAttribute = function(object,elem, attributes) {
    attributes = attributes || [];
    // ....
然后递归调用时,传入第三个参数:

addAttribute(object[key], value, attributes);
下面是一个非常简单的示例,演示:

函数foonum,数组{ 数组=数组| |[]; array.pushnum; console.logpush+num+,array=+JSON.stringifyarray; 如果num<5{ foonum+1,数组; } } foo1 使用闭包

function fn() {
    function recursiveFunction() {
        // do something with x
        recursiveFunction();
    }
    var x = 0;
    recursiveFunction();
}
使用闭包

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

它不起作用,因为调用方函数属性不能设置为被调用函数属性。@NémethPéter:对不起,我不明白你所说的调用方函数属性或被调用函数属性是什么意思。上面使用的是单个共享数组,与Nina答案中的单个共享x完全相同。它不起作用,因为调用者函数属性不能设置为被调用函数属性。@NémethPéter:对不起,我不明白你所说的调用者函数属性或被调用函数属性是什么意思。上面将使用单个共享数组,与Nina答案中的单个共享x完全相同。