在应用程序函数中推送后返回数组的长度



我有以下存储数据的应用程序函数。用户可以添加新项目,它将返回数据数组的长度。

我试图理解为什么在函数中返回数据会返回包括推送项的数据,但返回data.length不会,应用过滤器也不会。如果我请求应用程序功能范围之外的数据长度,它会返回它,包括推送的项目。

在我的示例中,getfnapp.data.lengthapp.data.filter返回添加的项,但getcntfnfilterinitialfn不返回。为什么会这样?

var app = (function () {
var data = ["initial"];
function add(x) { data.push(x) }
function getfn() { return data };
function getcntfn() { return data.length };
function filterinitialfn(filter) { return data.filter(x => x == filter) }
return {
add: function (x) { add(x) },
data:data,
getfn: getfn(),
getcntfn: getcntfn(),
filterinitialfn: function(filter) {filterinitialfn(filter)}
}
}());
app.add("added")
console.log("app.getfn", app.getfn)                                             //["initial", "added"]
console.log("app.getcntfn", app.getcntfn)                                       //1  ???
console.log("app.data.length", app.data.length)                                 //2
console.log("app.filterinitialfn", app.filterinitialfn("added"))              //[]  ???
console.log("app.filterinitial=>", app.data.filter(x => x == "added"))          //["added"]

因为返回函数时会立即调用它,所以它不能从初始状态更改,所以将其更改为:

return {
add: function (x) { add(x) },
data:data,
getfn: getfn,
getcntfn: getcntfn,
filterinitialfn: filterinitialfn,
}

当然,在使用then时,应该包含圆括号。

例如,getfn: getfn()的结果在初始化时进行评估,在调用它时不会"更改值"。

您需要在不调用函数的情况下传递函数本身,以便在调用时对其进行评估:

getfn: getfn,
getcntfn: getcntfn,
...

由于您的所有函数都与返回对象键同名,因此我们可以使用简写来创建对象:

var app = (function () {
var data = ["initial"];
function add(x) { data.push(x) }
function getfn() { return data };
function getcntfn() { return data.length };
function filterinitialfn(filterBy) { return data.filter(x => x == "added") }
function filterBy(filterBy) { return data.filter(x => x == filterBy); }
return {
add,
data,
getfn,
getcntfn,
filterinitialfn,
filterBy
}
}());
app.add("added")
console.log("app.getfn", app.getfn())
console.log("app.getcntfn", app.getcntfn())
console.log("app.data.length", app.data.length)
console.log("app.filterinitialfn", app.filterinitialfn())
console.log("app.filterinitial=>", app.data.filter(x => x == "added"))
console.log("app.filterBy", app.filterBy('initial'))

最新更新