Javascript 推送应用程序函数后返回数组长度

Javascript 推送应用程序函数后返回数组长度,javascript,arrays,function,Javascript,Arrays,Function,我有以下存储数据的应用程序功能。用户可以添加新项,并返回数据数组的长度 我试图理解为什么在函数中返回数据会返回包含推送项的数据,但返回数据。length不会,应用过滤器也不会。如果我请求应用程序功能范围之外的数据长度,它会返回它,包括推送的项目 在我的示例中,getfn、app.data.length和app.data.filter返回添加的项目,但getcntfn和filterinitialfn不返回。为什么会这样 var-app=(函数(){ 风险值数据=[“初始”]; 函数add(x){

我有以下存储数据的应用程序功能。用户可以添加新项,并返回数据数组的长度

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

在我的示例中,
getfn
app.data.length
app.data.filter
返回添加的项目,但
getcntfn
filterinitialfn
不返回。为什么会这样

var-app=(函数(){
风险值数据=[“初始”];
函数add(x){data.push(x)}
函数getfn(){返回数据};
函数getcntfn(){return data.length};
函数filterinitialfn(filter){返回数据.filter(x=>x==filter)}
返回{
add:function(x){add(x)},
数据:数据,
getfn:getfn(),
getcntfn:getcntfn(),
filterinitialfn:函数(筛选器){filterinitialfn(筛选器)}
}
}());
应用程序添加(“添加”)
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=(函数(){
风险值数据=[“初始”];
函数add(x){data.push(x)}
函数getfn(){返回数据};
函数getcntfn(){return data.length};
函数filterinitialfn(filterBy){返回数据.filter(x=>x==“已添加”)}
函数filterBy(filterBy){返回数据.filter(x=>x==filterBy);}
返回{
添加
数据,
getfn,
getcntfn,
过滤器初始化,
肮脏的
}
}());
应用程序添加(“添加”)
log(“app.getfn”,app.getfn())
log(“app.getcntfn”,app.getcntfn())
console.log(“app.data.length”,app.data.length)
log(“app.filterinitialfn”,app.filterinitialfn())
console.log(“app.filterinitial=>”,app.data.filter(x=>x==“added”))

console.log(“app.filterBy”,app.filterBy('initial'))
您在添加之前正在创建的
app
,以及
getfn
getcntfn
filterinitialfn
不是函数(尽管您将它们命名为函数,这令人困惑),但是它们的返回,并且永远不要更改。您正在执行return语句中的函数,例如
getcntfn:getcntfn()
。您不应该这样做,否则该值将与创建应用程序函数时的值相同。您应该使用
getcntfn:getcntfn
(或者只是
getcntfn
),然后实际调用函数,例如
app.getcntfn()
,而不是
app.getcntfn
。我收集到它会立即执行,但让我感到困惑的是,“getfn”确实返回推送的项,而“getcntfn”则不会,尽管他们是以同样的方式开始的。谢谢,这是非常有用的。但是,假设我仍然希望将参数传递给其中一些,例如过滤器:`var app=(函数(){var data=[“initial”];函数add(x){data.push(x)}函数filterinitalfn(filter){return data.filter(x=>x==filter)}返回{add filterinitalfn:function(filter){filterinitialfn(filter)}}});app.add(“added”)console.log(“app.filterinitialfn”,app.filterinitialfn(“initial”)`您可以正常传递函数参数。请查看我的编辑,我添加了一个
过滤器by
作为示例!你是摇滚明星。工作起来很有魅力,而且速记技巧也会为我节省大量的编码时间。