Javascript问题。变量设置在函数内但在函数之外它不是

时间:2014-01-13 17:42:35

标签: javascript

我这里有一些代码

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会打印原始订单。这是为什么?

4 个答案:

答案 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;

这会交换两个参数person1person2的值,但它们是函数的局部值,因此它不会影响函数外部的变量。

上述代码中的一个简单解决方案是使用闭包。不要传递变量或接收变量!

function Scheck() {

...

Scheck();

现在在Scheck函数中,由于没有名为person1person2的局部变量或参数,它将使用外部作用域中的变量。然后交换将按预期工作。


另一种选择是将对象或数组传递给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是假的,没有任何变化。