以两种不同的方式编写函数:一种方式导致TypeError,另一种导致TypeError。为什么?
问题描述:
我遇到过一个问题,我不明白发生了什么事。设置如下:用户进入屏幕并输入姓氏。我取最后一个名字并搜索一个电话簿(当用户进入屏幕时,整个电话簿已经被取回,因此它只是坐在那里作为一个胖胖的JavaScript数组)。以两种不同的方式编写函数:一种方式导致TypeError,另一种导致TypeError。为什么?
让我们假设电话簿对象的每个元素包含:姓氏,名字和电话号码。现在,我将输入用户输入的姓氏,并在电话簿中循环查找匹配的姓氏。然后,我会将每个匹配元素推送到一个数组中,并将该数组显示给用户。
我已经写了两种不同的方法来做到这一点。第一种方式返回对象列表。在第二种方式(我的首选)中,会引发TypeError。
这是第一种方法
$scope.getMatchingLastNames = function(){
for(i=0; i<$scope.phoneBook.length; i++){
if($scope.lastName==$scope.phoneBook[i].lastName){
$scope.filteredArray.push($scope.phoneBook[i]);
}
};
第二种方法:
$scope.getList = function(){
$scope.filteredArray = getLastNames($scope.lastName,
$scope.phoneBook, $scope.phoneBook.length);
}
其中要求
function getLastNames(lastName, phoneBook, length)
{
var filteredArray = [];
for(var i=0; i<length; i++){
if(lastName==phoneBook[i].lastName){
filteredArray.push(phoneBook[i]);
}
}
return filteredArray;
}
当我运行第二种方法我会在Chrome中的错误控制台如下:
个TypeError: Cannot read property 'lastName' of undefined
和错误指向,如果条件:
if(lastName==phoneBook[i].lastName)
为什么第二种方法导致错误有人能解释一下吗?
谢谢。
答
既然你要实现的目标是要筛选结果列表,我建议你使用angularJs过滤器
我准备了的jsfiddle给你一个简单的例子: https://jsfiddle.net/fb0r7z0q/
这是关键行:
<li ng-repeat="entry in phonebook | filter:qname">
qname的是你的$ scope.lastName
注意,解析器将加载FNS decla的/ PASE-机构红色像这样'function getLastNames'第一个...然后runetime会威胁'var x = function()..'像valiables和尸体将被贴上像runetime – animaacija
如果你重写'function getLastNames(lastName,phoneBook,length )'在'getLastNames =函数(lastName,phoneBook,length)'这样的方式? – animaacija
@animaacija:谢谢。我会研究JavaScript解释器。我对它的工作原理并不了解,所以这可能是一个好的第一步。为了回答你的第二个问题:我重构了代码,因为其他开发人员最终为许多变量添加了$ scope,所以我试图尽量减少清理代码。例如,第一个方法有一个$ scope.phoneBook,但它不会绑定到视图中的任何内容。 – jrDeveloper