jQuery .each函数不持久化全局变量

时间:2016-06-08 13:26:19

标签: javascript jquery

我有一个函数,我希望运行.each循环并返回值的运行总计

在我的.each函数结束时,amountSold变量为0,在.each循环期间,它显示为未定义。我做错了什么?

function processChange(currentTarget) {
    var amountSold = 0;  //VARIABLE DECLARED
    //limit these operations to the currentlySelected tab
    var availableFundContainer = $(currentTarget).closest(".available-content").parent();

    var fundBeingSold = $(availableFundContainer.children(0)).attr('data-investment-code');

    availableFundContainer.find('.available-handler').each(function (index, val) {       
        var origVal = $(this).attr('data-original-value');
        var currentSliderVal = $(this).next('.available-content').find('.slider').slider("value");
        var amountSold = amountSold + (origVal - currentSliderVal); //PROBLEM LINE!!!!!
....}

3 个答案:

答案 0 :(得分:5)

您正在每个回调函数中创建一个本地范围的变量,也称为amountSold。

替换

var amountSold = amountSold + (origVal - currentSliderVal); //PROBLEM LINE!!!!!

amountSold += (origVal - currentSliderVal); //PROBLEM LINE!!!!!

答案 1 :(得分:1)

您对JS中函数作用域的工作原理感到困惑。请考虑以下示例:

var someArray = [0,1,2,3,4,5];
var a = 0;
var b = 0;

someArray.forEach(function(item) {
  a = a + item;
  var b = b + item;
  console.log("loop", a, b);
});

console.log("final", a, b);

运行代码段,您将在循环中看到变量b从未定义开始。之所以如此,因为传递给forEach方法的函数会创建一个新范围,而使用var语句声明的任何变量都将覆盖父范围中存在的任何变量。在这种情况下,这意味着b最终成为NaN。另一方面,a保持其先前的值并按预期​​增加。

最终的控制台日志表明,全局范围中b的值未被循环中执行的语句更改。

JS的这一特性允许用户创建一个对全局范围没有副作用的函数。

要回答您的问题,您使用的是var声明:

var amountSold = amountSold + (origVal - currentSliderVal);

何时应该使用简单的作业

amountSold = amountSold + (origVal - currentSliderVal);

答案 2 :(得分:0)

使用

使变量成为全局变量
window.amountSold = 0

在循环内部,只需按照相同的方式调用

window.amountSold += (origVal - currentSliderVal);