我有一个函数,我希望运行.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!!!!!
....}
答案 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);