我对javascript很新,并试图理解一些非常重要的事情 - 至少我希望:)事情。
我的问题很笼统,但我有一个具体的例子可以帮助我提出问题并帮助你理解我的意思。
示例:
function updateBookmark(bookmark){
var index = _.findIndex($scope.bookmarks, function(b){
return b.id == bookmark.id;
});
return index;
}
很明显,findIndex函数是在某处声明(在我们的例子中是 - lodash.js) 它有两个参数(至少两个可见参数:数据集和函数)
在这个例子中,什么是b ? b如何获得它的价值?我理解b是每个数据集的对象,但我的意思是 - 这里的幕后工作是什么,所以b会是什么??
作者选择通过bookmark.id,
传递一个等于b.id的匿名函数我知道他可以在他使用的地方使用bookmark.id,但是 findIndex如何访问这个书签?!
这个函数我之前得出的结论是在其他地方声明的,它是否得到了范围内的所有变量如何? 这里发生了什么?
先感谢响应者,并对这个凌乱的问题感到抱歉...... 吉姆。
答案 0 :(得分:1)
如果你改写了一些东西,就会更容易理解。
从最后一部分开始:
// Q: "How does `findIndex`have access to `bookmark`"
_.findIndex(bookmarks, function (b) { });
// A: "It doesn't."
var bookmark = { id: 1 };
var bookmarks = [ /* ... */ ];
function compareWithBookmark( test ) {
return test.id === bookmark.id;
}
_.findIndex(bookmarks, compareWithBookmark);
如您所见,findIndex实际上无权访问书签 相反,它可以访问一个函数,它可以传递一个值来测试,该函数将返回该测试是通过还是失败。
在.findIndex
或[].map
或[].filter
的封面下,他们只是采取一个函数,创建一个循环,每次将一个元素传递给函数,并且用返回值做某事。
function findIndex (array, test) {
var index = -1;
var i = 0;
var l = array.length;
var el;
var result;
for (; i < l; i += 1) {
el = array[i]; // <-- how `b` got its value
result = test(el, i, array); // <-- test(b)
if (!!result) {
index = i;
break;
}
}
return index;
}
不同的函数会对结果做不同的事情(map
返回一个包含每个result
的新数组,filter
返回一个只传递!!result
个测试的数组,等等),但所有这些都是内循环。
这也是循环结构和注意事项的一个非常简单的简化,但它正是推动你预期行为的原因。
这是我刚刚定义的函数的完整用法,加上数组,以及我正在检查的对象。
var bookmarks = [
{ id: 2 },
{ id: 3 },
{ id: 6 },
{ id: 14 }
];
var bookmark = { id: 3 };
function compareBookmarkIdTest (el) {
return el.id === bookmark.id;
}
var index = findIndex(bookmarks, compareBookmarkIdTest);
index; // 1
希望有所帮助。