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()();