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范围定义的概念。有人可以帮我吗?
答案 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))