繁体   English   中英

如何在创建函数时不可用的回调函数中使用变量

[英]How to use a variable in a callback function that is not available when the function is created

我正在学习Javascript中的函数编程,并且在以下代码中遇到错误。 该错误表明该list未定义。 这显然来自我的filterVideos函数,因为它使用列表,但是列表尚未定义。 我知道我可以将函数放入return语句中,但是我试图将函数与return语句分开。 所以我的问题是,在定义列表变量之前,有没有办法让我声明该函数?

var myFunction = function() {
    var lists = [
            {
                "id": 5434364,
                "name": "New Releases"
            },
            {
                "id": 65456475,
                name: "Thrillers"
            }
        ],
        videos = [
            {
                "listId": 5434364,
                "id": 65432445,
                "title": "The Chamber"
            },
            {
                "listId": 5434364,
                "id": 675465,
                "title": "Fracture"
            },
            {
                "listId": 65456475,
                "id": 70111470,
                "title": "Die Hard"
            },
            {
                "listId": 65456475,
                "id": 654356453,
                "title": "Bad Boys"
            }
        ];

    var filterVideos = function(video){ return video.listId == list.id;};
    var mapVideos = function(video){return {id: video.id, title: video.title};};

    return lists.map(function(list) {
        return {
          name: list.name,
          videos: videos.filter(filterVideos).map(mapVideos)
        };
    });
}

myFunction();

您可以更改filterVideos,以便它生成具有范围内列表的过滤功能:

var myFunction = function() {
    var lists = [{
            "id": 5434364,
            "name": "New Releases"
        }, {
            "id": 65456475,
            name: "Thrillers"
        }],
        videos = [{
            "listId": 5434364,
            "id": 65432445,
            "title": "The Chamber"
        }, {
            "listId": 5434364,
            "id": 675465,
            "title": "Fracture"
        }, {
            "listId": 65456475,
            "id": 70111470,
            "title": "Die Hard"
        }, {
            "listId": 65456475,
            "id": 654356453,
            "title": "Bad Boys"
        }];

    var filterVideos = function(list) {
        return function(video) {
            return video.listId == list.id;
        };
    };
    var mapVideos = function(video) {
        return {
            id: video.id,
            title: video.title
        };
    };

    return lists.map(function(list) {
        return {
            name: list.name,
            videos: videos.filter(filterVideos(list)).map(mapVideos)
        };
    });
}

myFunction();

就像您说的那样,该错误是因为列表尚未在代码中定义。 两种明显的解决方案是将其移到定义它的范围内(您说您不想这样做),或者将其作为参数传递给filterVideos函数,以便在其中使用它。

由于您无法更改过滤器传递给其回调的参数,因此,最明显的解决方案是创建一个闭包,该闭包定义该参数并返回范围为“ list”的函数。

var filterVideos = function(list) {
    return function(video) {
        return video.listId == list.id;
    }
};
var mapVideos = function(video){
    return {id: video.id, title: video.title};
};

return lists.map(function(list) {
    return {
      name: list.name,
      videos: videos.filter(filterVideos(list)).map(mapVideos)
    };
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM