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
作为示例!你是摇滚明星。工作起来很有魅力,而且速记技巧也会为我节省大量的编码时间。