更改全局变量

时间:2015-09-08 14:40:16

标签: javascript

我每次单击按钮时都会尝试更改var值。但由于某种原因,var值不断变回0.不确定这是否是范围问题?

尝试在每次点击时将全局var curPos更新为reqPos值

请参阅以下代码

var reqPos = 0,
    curPos = 0;


function viewRotate(curPos, reqPos){

  var curPos = reqPos;
  console.log('1 ' + reqPos + curPos);

  if(curPos === 0 && reqPos === 12) {

    for(var j = 0; j < reqPos; j++){
      curPos++;
    }
    curPos = reqPos;
  }
  else if (curPos === 0 && reqPos === 24) {

    for(var j = 0; j < reqPos; j++){
      curPos++;
    }
    curPos = reqPos;
  }
  else if (curPos === 0 && reqPos === 36) {
    for(var j = 0; j < reqPos; j++){
      curPos++;
    }
    curPos = reqPos;
  }
}

e('.btn-front').click(function(){
    viewRotate(curPos, 0);
    console.log(reqPos);
});

e('.btn-right').click(function(){
    viewRotate(curPos, 12);
    console.log(reqPos);
});

e('.btn-back').click(function(){
    viewRotate(curPos, 24);
    console.log(reqPos);
});

e('.btn-left').click(function(){
    viewRotate(curPos, 36);
    console.log(reqPos);
});

4 个答案:

答案 0 :(得分:4)

这确实是一个范围问题。您正在重新定义Update test set UserDATE = convert(nvarchar(10), convert(date, replace(UserDate, '/', ' '), 100), 105) 函数范围内的curPos变量,方法是在其前面添加viewRotate标记。请尝试以下操作,对已在var的“父”范围中定义的curPos执行分配:

viewRotate

在此之后,正如@PaulRoub指出的那样,您需要重新定义函数签名以删除function viewRotate(reqPos) { curPos = reqPos; // ... } 参数,因为基元是按值传递的:

curPos

答案 1 :(得分:1)

这实际上是阴影变量的问题:

var reqPos = 0,
    curPos = 0;


function viewRotate(curPos, reqPos){

此时您已失去对全球curPosreqPos的访问权限。重命名这些局部变量是一种方法。

另一种是在函数中本地处理数据,返回它并在click处理程序中进行赋值。

答案 2 :(得分:0)

您重新定义了curPos函数中的viewRotate()变量,这将使本地范围内的全局curPos变量蒙上阴影:

var reqPos = 0,
    curPos = 0; // <- Defining variable here


function viewRotate(curPos, reqPos){

  var curPos = reqPos; // <- Redefining it here

  ...

您应该完全重命名或删除curPos功能中的本地viewRotate()变量。

答案 3 :(得分:0)

在您的函数之外定义的变量 curPos 与您在函数中定义的 curPos 不同,即使它们具有相同的名称

JavaScript将全局变量 curPos (在函数外部)与本地变量 curPos (在函数内)分开。具有相同的名称不会使它们成为相同的变量。

要从您的函数内部访问全局 curPos ,请删除“var”关键字,如@sdgluck建议的那样。否则,你最终会在函数中创建一个全新的局部变量,它恰好与你的一个全局变量同名。

但话说回来,如果您需要做的只是

  

在每次点击时将全局var curPos更新为reqPos值

然后你不能使用一些更简单的代码?比如...

var curPos = 0;

function viewRotate( _reqPos ) {
    curPos = _reqPos;
}

e('.btn-front').click(function(){
    viewRotate( 0 );
});

e('.btn-right').click(function(){
    viewRotate( 12 );
});

e('.btn-back').click(function(){
    viewRotate( 24 );
});

e('.btn-left').click(function(){
    viewRotate( 36 );
});