[英]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.