Javascript初学者问题:数组与函数中不同引用为何能得到正确结果
const todos = [{ text: 'Eat breakfast', completed: true }, { text: 'Eat Lunch', completed: true }, { text: 'Eat Dinner', completed: false } ] const removeTodo = function(todos, todoText) { const index = todos.findIndex(function(todo) { return todo.text.toLowerCase() === todoText.toLowerCase() }) if (index > -1) { todos.splice(index, 1) } } removeTodo(todos, 'Eat breakfast') console.log(todos)
问题1解答
findIndex是JS数组内置的实例方法,你调用todos.findIndex()时,这个方法内部会自动遍历todos数组的每一项元素:
- 每遍历到一个元素,就会把这个元素作为实参,传给你传入
findIndex的回调函数的第一个形参 - 你这里给形参命名为
todo,所以todo拿到的就是当前遍历到的todos里的单个元素,自然可以直接访问todo.text。你说的“操作数组要带s的数组名”是手动写for循环的写法,用数组内置方法的时候,方法已经帮你把当前元素取出来了,不需要每次都写todos[下标].text,属于封装好的便利写法。
你完全可以把形参改成任意名字,比如改成item,写成return item.text.toLowerCase() === todoText.toLowerCase(),运行效果完全一致。
问题2解答
这个todo是回调函数的形参,它本身确实是可以任意命名的,和外部的todos数组没有提前绑定的关系,两者的关联是findIndex方法内部完成的:
- 你调用
todos.findIndex(回调函数)时,findIndex的执行上下文绑定的就是当前调用它的todos数组 findIndex内部会循环遍历todos的每一项,每一轮循环都执行一次你传入的回调,并且把当前循环到的todos元素,作为实参传给回调的第一个形参(也就是你命名的todo)- 定义这个参数的意义就是接收当前遍历到的单个元素,省去你自己写for循环、手动用下标获取
todos[i]的冗余代码。
内容的提问来源于stack exchange,提问作者blueberry24
相关产品推荐
相关产品推荐

