Javascript 更改全局变量

Javascript 更改全局变量,javascript,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 &am

每次我点击一个按钮,我都试图改变一个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);
});
var reqPos=0,
curPos=0;
功能视图旋转(curPos、reqPos){
var curPos=reqPos;
控制台日志('1'+reqPos+curPos);
如果(curPos==0&&reqPos==12){
对于(var j=0;j
这确实是一个范围问题。通过在
var
标记前面添加
curPos
变量,可以在
viewRotate
函数的作用域内重新定义该变量。尝试以下操作对已在
viewRotate
的“父”范围中定义的
curPos
执行赋值:

function viewRotate(reqPos) {
    curPos = reqPos;
    // ...
}
正如@PaulRoub所指出的,在原语按值传递时,需要重新定义函数签名以删除
curPos
参数:

function viewRotate(reqPos) { /*...*/ }
viewRotate(0); // Now call without `curPos`

这确实是一个范围问题。通过在
var
标记前面添加
curPos
变量,可以在
viewRotate
函数的作用域内重新定义该变量。尝试以下操作对已在
viewRotate
的“父”范围中定义的
curPos
执行赋值:

function viewRotate(reqPos) {
    curPos = reqPos;
    // ...
}
正如@PaulRoub所指出的,在原语按值传递时,需要重新定义函数签名以删除
curPos
参数:

function viewRotate(reqPos) { /*...*/ }
viewRotate(0); // Now call without `curPos`

这实际上是一个隐藏变量的问题:

var reqPos = 0,
    curPos = 0;


function viewRotate(curPos, reqPos){
此时,您已经无法访问全局
curPos
reqPos
。重命名这些局部变量是一种方法


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

实际上是隐藏变量的问题:

var reqPos = 0,
    curPos = 0;


function viewRotate(curPos, reqPos){
此时,您已经无法访问全局
curPos
reqPos
。重命名这些局部变量是一种方法


另一种方法是在函数中本地处理数据,返回数据并在
单击处理程序中执行赋值。

您在
viewRotate()
函数中重新定义了
curPos
变量,该变量将覆盖本地范围内的全局
curPos
变量:

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


function viewRotate(curPos, reqPos){

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

  ...
var reqPos=0,

curPos=0;// 您在
viewRotate()
函数中重新定义了
curPos
变量,该变量将覆盖局部范围内的全局
curPos
变量:

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


function viewRotate(curPos, reqPos){

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

  ...
var reqPos=0,

curPos=0;// 函数外部定义的变量curPos与函数内部定义的变量curPos不同,即使它们具有相同的名称

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

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

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

每次单击时,将全局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 );
});

函数外部定义的变量curPos与函数内部定义的变量curPos不同,即使它们具有相同的名称

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

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

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

每次单击时,将全局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 );
});

调用函数时,
reqPos
等于零,函数不会将
curPos
更改为任何其他值。这确实是一个范围问题。@Hoten是的,但即使已修复,它仍然无法工作;该函数在开始时将
curPos
设置为
reqPos
,如果这些测试中的任何一个成功,则再次设置。var正在生成一个新变量。它屏蔽了外部curPos。了解到它可能是一个范围问题后,您采取了哪些步骤?因为这是对作用域的严重违反,简单地重命名可能会解决您的问题。您调用函数时,
reqPos
等于零,并且该函数从未将
curPos
更改为任何其他值。这确实是一个范围问题。@Hoten是的,但即使已修复,它仍然无法工作;该功能在开始时将
curPos
设置为
reqPos
,如果出现任何此类情况,则再次设置