我在使用数组中的原型函数进行排序时,围绕范围问题缠绕我的大脑时遇到了问题。我可以使它在静态项目上工作,但是当我尝试推广处理数组时,我开始看到“不是函数”错误。这是我目前对代码的再现。任何帮助将不胜感激。
function Automobile(year, make, model, type) {
this.year = year; //integer (ex. 2001, 1995)
this.make = make; //string (ex. Honda, Ford)
this.model = model; //string (ex. Accord, Focus)
this.type = type; //string (ex. Pickup, SUV)
}
Automobile.prototype.logMe = function(bool) {
console.log("Working"); //testing function
if (bool == true) {
console.log(this);
}
};
/*Sample Array*/
var automobiles = [
new Automobile(1995, "Honda", "Accord", "Sedan"),
new Automobile(1990, "Ford", "F-150", "Pickup"),
new Automobile(2000, "GMC", "Tahoe", "SUV"),
new Automobile(2010, "Toyota", "Tacoma", "Pickup"),
new Automobile(2005, "Lotus", "Elise", "Roadster"),
new Automobile(2008, "Subaru", "Outback", "Wagon")
];
/*This function sorts arrays using an arbitrary comparator.*/
function sortArr(comparator, array) {
array.sort(function(a, b) {
return comparator(a, b);
});
return array;
}
function exComparator(int1, int2) {
if (int1 > int2) {
return true;
} else {
return false;
}
}
function yearComparator(auto1, auto2) {
return exComparator(auto1.year, auto2.year);
}
/* Output*/
console.log("*****");
console.log("The cars sorted by year are:");
forEach(sortArr(yearComparator, automobiles), automobiles.logMe(true)); //This is not right!
function forEach(array, doStuff) {
for (var i = 0; i < array.length; i++)
doStuff(array[i]);
}
答案 0 :(得分:1)
您报告的问题与排序没有任何关系(尽管排序比较器功能也无效 - 见下文)。
您获得的错误是因为您将forEach
的结果传递给logMe
函数而不是对该函数的引用。无论如何,automobiles.sort(yearComparator).forEach(function(auto) {
auto.logMe(true);
});
函数是共享的实例方法,并且不能通过数组。
您的排序功能也是不必要的 - 您可以编写整个排序/显示循环:
sortArr
然后删除不重复的标准ES5功能的forEach
和false / true
函数。
要修复比较器,需要返回(-ve,0,+ ve)中的一个,而不是function yearComparator(auto1, auto2) {
return auto1.year - auto2.year;
}
。对于数字比较,只需返回两个数字之间的差异就足够了:
names = new String[100];
messages = new String[100];
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
答案 1 :(得分:0)
主要问题是&#34; automobiles.logMe(true)&#34;。汽车是汽车对象的阵列。阵列汽车中的每个元素都可以访问其原型函数logMe(),但不能访问数组本身。
此外,doStuff(array [i])反映出您应该了解有关三个重要函数(call,apply,bind)的更多信息。稍微查看一下本文将有助于:http://javascriptissexy.com/javascript-apply-call-and-bind-methods-are-essential-for-javascript-professionals/