推入应用函数后返回数组的长度

时间:2021-05-21 13:04:22

标签: javascript arrays function

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

我试图理解为什么在函数中返回数据会返回包含推送项目的数据,但返回 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"]

2 个答案:

答案 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'))

相关问题