我这里有一些代码
var F;
var favv= ['E','I','A','O','U'];
var i = 0;
function vowelcount(arg, favv)
{
for(i=0;i<favv.length;i++) {
c = 0;
V = favv[i];
for (j=0;j<arg.length;j++) {
if (arg[j].toUpperCase()===V) {
c++;
};
}
if (c>0) {
F=V;
return c;
}
}
}
var person1 = {name:"Super",spd:20};
var person2 = {name:"Supeer",spd:20};
function Scheck(person1, person2) {
if (person2.spd>person1.spd) {
var sub=person1;
person1=person2;
person2=sub;
} else if (person2.spd===person1.spd) {
var ct1 = vowelcount(person1.name, favv);
var ct2 = vowelcount(person2.name,F);
if (ct2 > ct1) {
var subp = person1;
person1= person2;
person2=subp;
}
}
console.log(person1);
console.log(person2);
}
Scheck(person1,person2);
console.log(person1);
console.log(person2);
这里我有一个元音数组,两个人的属性名称和spd。当我运行Scheck时,我想使用vowelcount来确定人们在他们的Speed统计数据相等时会移动的顺序。如果查看函数内的console.logs,它们会打印正确的名称......但是在函数之后,console.logs会打印原始订单。这是为什么?
答案 0 :(得分:4)
您有范围问题。你在全局范围内声明了person1和person2,但是然后将它们作为你的函数参数,这很邋。。
将函数中的参数命名为不同的,然后maek Scheck实际返回person1和person2的值。
你可以像这样制作Scheck:
function Scheck(p1, p2)
{
// ... do things
return [p1, p2];
}
然后像这样收到它:
var persons = Scheck(person1, person2);
person1 = persons[0];
person2 = persons[1];
答案 1 :(得分:2)
您正在分配函数的参数(创建局部变量),而不是全局变量。
如果你想改变全局状态,你根本就不应该有这些参数。
答案 2 :(得分:2)
var subp = person1;
person1= person2;
person2=subp;
这会交换两个参数person1
和person2
的值,但它们是函数的局部值,因此它不会影响函数外部的变量。
上述代码中的一个简单解决方案是使用闭包。不要传递变量或接收变量!
function Scheck() {
...
Scheck();
现在在Scheck函数中,由于没有名为person1
和person2
的局部变量或参数,它将使用外部作用域中的变量。然后交换将按预期工作。
另一种选择是将对象或数组传递给Scheck函数。该函数将能够更改对象的属性,并且这些更改将反映在外部,因为正在引用相同的对象。您可以使用数组,但这是带对象的示例:
function Scheck(people) {
var person1 = people.first; // or people[0] if you used an array
var person2 = people.second; // or people[1] if you used an array
...
if(ct2>ct1)
{
people.first = person2; // Set people[0] for an array
people.second = person1;
}
...
var people = {
first: person1,
second: person2
};
Scheck();
person1 = people.first;
person2 = people.second;
// or for an array:
var people = [person1, person2];
Scheck(people);
person1 = people[0];
person2 = people[1];
答案 3 :(得分:1)
在Scheck中,使用F作为第二个参数。已经声明了F,但没有给出一个值,所以它失败为num&gt; undefined是假的,没有任何变化。