我有以下存储数据的应用程序功能。用户可以添加新项目并返回数据数组的长度。
我试图理解为什么在函数中返回数据会返回包含推送项目的数据,但返回 data.length
不会,也不会应用过滤器。如果我请求应用函数范围之外的数据长度,它会返回它,包括推送的项目。
在我的示例中, getfn
、 app.data.length
和 app.data.filter
返回添加的项目,但 getcntfn
和 filterinitialfn
不返回。这是为什么?
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"]
答案 0 :(得分:2)
因为你是在返回时立即调用该函数,所以它不能从初始状态改变,所以将其更改为:
return {
add: function (x) { add(x) },
data:data,
getfn: getfn,
getcntfn: getcntfn,
filterinitialfn: filterinitialfn,
}
当然,在使用 then 时应该包括括号。
答案 1 :(得分:0)
例如,getfn: getfn()
的结果是在初始化时计算的,调用时不会改变其值。
您需要传递函数本身,而不是调用它,以便在调用时对其进行评估:
getfn: getfn,
getcntfn: getcntfn,
...
由于所有函数的名称都与返回对象键的名称相同,因此我们可以使用 the shorthand 创建对象:
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'))