Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.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 JS闭包和递归_Javascript_Recursion_Closures - Fatal编程技术网

Javascript JS闭包和递归

Javascript JS闭包和递归,javascript,recursion,closures,Javascript,Recursion,Closures,例如,我有一个带有闭包的函数: function getData() { var status = 0; var func = function() { status++ alert(status); } return func; } 其工作正常,并且变量“status”在闭包函数中可见 但如果我将闭包代码转移到单独的函数中,则闭包变量“status”不可用: function getData() { var stat

例如,我有一个带有闭包的函数:

function getData() {
    var status = 0;

    var func = function() {
        status++
        alert(status);
    }

    return func;
}
其工作正常,并且变量“status”在闭包函数中可见

但如果我将闭包代码转移到单独的函数中,则闭包变量“status”不可用:

function getData() {
    var status = 0;

    var func = function() {
        myFunction();
    }

    return func;
}


function myFunction() {
     status++
     alert(status);
}
是的,我可以将此变量发送到函数,然后返回更改后的值。但是如果我在“myFunction”中需要递归呢

如何为所有对闭包函数的调用获取变量“status”的一个实例


谢谢

您可以替换这一行:

myFunction(status);
与:

或:

JSFIDDLE:


这就是你想要的吗?

首先,这不起作用,因为JS有词法作用域,而不是动态作用域

其次,如果您想将变量传递给函数,并允许该函数对其进行变异,则需要发送
对象的
实例

0 instanceof Object
false
"" instanceof Object
false
[] instanceof Object
true
({}) instanceof Object
true
(function(){}) instanceof Object
true
您可以将数字包装成一个对象并传递它

修改示例:

function getData() {
    var o = {
        status: 0
    };

    var a = function () {
        myFunction(o);
    }
    return a;
}


function myFunction(o) {
    console.log(o);
    if (o.status == 0) {
        o.status = 1;
        // After calling this function again "status" will reset to 0, 
        // but I want to save current value (status = 1). 
        data();
    }
    return o.status++;
}

var data = getData();
data();
输出:

Object {status: 0}
Object {status: 1}

如果我将闭包代码转移到单独的函数中,则闭包变量“status”不可用

是的,这不会因为JavaScript的作用域规则而改变

是的,我可以将此变量发送到函数,然后返回更改后的值。但是如果我在“myFunction”中需要递归呢

没有什么变化。也可以从闭包内部使用递归

function getData() {
    var status = 0;

    function data() {
        if (status++ == 0) {
            // do anything you want
            // including recursive calls to `data()`
        }
        return status;
    }

    return data;
}

getData()();

data()应该是
getData()?递归在哪里?为什么不传递状态?为什么在24小时内突然有两个关于闭包和递归的问题?我很怀疑,虽然我不知道甜菜根是什么,你是说这个吗?是的@san.chez就是那个。我很确定大约4、5天前也有一个,尽管我找不到。
function getData() {
    var o = {
        status: 0
    };

    var a = function () {
        myFunction(o);
    }
    return a;
}


function myFunction(o) {
    console.log(o);
    if (o.status == 0) {
        o.status = 1;
        // After calling this function again "status" will reset to 0, 
        // but I want to save current value (status = 1). 
        data();
    }
    return o.status++;
}

var data = getData();
data();
Object {status: 0}
Object {status: 1}
function getData() {
    var status = 0;

    function data() {
        if (status++ == 0) {
            // do anything you want
            // including recursive calls to `data()`
        }
        return status;
    }

    return data;
}

getData()();