重新定义局部变量

时间:2017-02-15 07:26:10

标签: javascript

我在想,重新声明一个本地javascript变量会被忽略,但我很惊讶这个函数总是返回“null”。当我从第二个“var qty”声明中删除“ var ”时,它开始返回有效数量。

可能是什么原因?我在Google Chrome扩展程序的顶部使用“use strict”。

function get_quantity(firstname)
    {
        var qty = null;


                var firstindex = 3;
                var qtyindex = 5;


        $('#' + gg_first_id + " tr").each(function (index)
            {
                console.log("index=" + index);

                if (index == 0)
                    {
                        return;
                    }



                var firstnamere = new RegExp(firstname,"i");

                if ($(this).find('td:eq(' + firstindex + ')').text().trim().match(firstnamere))
                    {
                       var  qty = $(this).find('td:eq(' + qtyindex + ')').text().trim();

                        qty = parseFloat(qty.replace(/,/, ''));


                        return false;

                    }

            });


        return qty;
    }

3 个答案:

答案 0 :(得分:4)

原因是重新声明局部变量被忽略。会发生的是,局部变量qty被创建,在<{1}}处理程序的上下文中阴影旧的变量each。只要each返回,就会恢复旧变量。

答案 1 :(得分:2)

这是范围问题。

当您在匿名qty函数内定义function (index)时,它会创建一个新的局部变量,该变量仅存在于该函数的范围内。该局部变量是它自己的变量,并且与更宽范围的qty变量没有关联。

考虑一下:

&#13;
&#13;
var i = 1;

//Expected value is 1
console.log(i);

function initVar(){
  var i = 2;
  
  //Expected value is 2
  console.log(i);
}

//Set the local variable inside the function to 2. Does not affect outer scope.
initVar();

//Expected value is 1
console.log(i);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我只想根据@ Unlocked的答案添加两个简单的例子。正如您在下面的示例中所看到的,您可以看到第一个i绑定到外部作用域,而另一个i绑定到内部作用域。正如您在运行示例this === that时所看到的那样,这意味着this.i是外部作用域的i,由于声明了变量,它隐藏在自调用函数中同名。

var i = 1
var that = this

;(function(){
  var i = 2
  
  // `i` of the inner scope
  console.log('i:', i)
  
  // `i` of the outer scope
  console.log('this.i:', this.i)
  
  // proving that `this` is the the outer scope
  console.log('this === that:', this === that)
})()

您似乎想到的是所有变量都在范围顶部实例化(未声明),这是正确的,但您必须知道范围是什么。在下面的示例中,您可以看到在函数中声明变量之前可以使用console.log(),因为Javascript的工作原理。

;(function(){
  // `i` will be declared but not defined
  console.log('i:', i)

  var i = 1
})()

;(function(){
  // `i` will not be declared in this scope
  console.log('i:', i)
  
  function anonymous(){
    var i = 1
  }
})()