循环和if语句计数器变量作用域的Java语言

时间:2018-07-05 15:35:37

标签: javascript scope

function analyse(data) {
    var counter = 0;
    for (let i = 0; i < data.length; i++) {
        if (data[i].closed == true) {
            counter++;
        }
    }
    $scope.totalOpen = data.length - counter;
    $scope.totalClosed = counter;
}

我正在编写一个简单的函数,该函数可以迭代数组并在数组值内的对象为true时递增counter。但是,看起来counter语句内的if变量的范围与counter循环上方的for变量的作用域不同。因此,即使有些对象以totalClosed关闭,true变量也只会分配零。我想我不太了解Javascript范围定义的概念。有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

要以@Taplar的旁注为基础,您可以使用过滤器更清晰地实现此目标:

function analyse(data) {
    var closedItems = data.filter(function (item) { return item.closed });
    var totalClosed = closedItems.length;
    var totalOpen = data.length - totalClosed;
    console.log(totalOpen)
    console.log(totalClosed)
}

或者,以ES6语法:

const analyze = (data) => {
    const closedItems = data.filter(item => item.closed);
    const totalClosed = closedItems.length;
    const totalOpen = data.length - totalClosed;
    return {totalOpen, totalClosed}
}

答案 1 :(得分:0)

  
    

JavaScript具有两个作用域-全局和局部。在函数外部声明的任何变量都属于全局范围,因此可以从代码中的任何位置访问。每个函数都有自己的作用域,并且只能从该函数和任何嵌套函数访问该函数内声明的任何变量。由于JavaScript中的本地范围是由函数创建的,因此也称为函数范围。当我们将一个函数放到另一个函数中时,就会创建嵌套作用域。

  

您的计数器范围没有问题。这是根据您的问题得出的有效示例:

data=[
{
"closed":true
},{
"closed":false
}]

function analyse(data) {
    var counter = 0;
    for (let i = 0; i < data.length; i++) {
        if (data[i].closed == true) {
            counter++;
        }
    }
    var totalOpen = data.length - counter;
    var totalClosed = counter;
    console.log(totalClosed);
    return totalClosed;
}
console.log(analyse(data))