在js中怎么结束当前for循环?

JavaScript018

在js中怎么结束当前for循环?,第1张

break结束循环推荐使用。

return 直接跳出方法。

js中的break 、continue,、return

break语句会使运行的程序立刻退出包含在最内层的循环或者退出一个switch语句。

由于它是用来退出循环或者switch语句,所以只有当它出现在这些语句时,这种形式的break语句才是合法的。

continue语句和break语句相似。所不同的是,它不是退出一个循环,而是开始循环的一次新迭代。

continue语句只能用在while语句、do/while语句、for语句、或者for/in语句的循环体内,在其它地方使用都会引起错误。

return语句就是用于指定函数返回的值。

return语句只能出现在函数体内,出现在代码中的其他任何地方都会造成语法错误,当执行return语句时,即使函数主体中还有其他语句,函数执行也会停止。

结束for循环肯定是break return是直接结束这段代码

多层循环可以提现出来

假如有两层循环 你在内存循环中写个if条件为真时 break 这样只是结束了内存的循环 但是外层的循环还会继续

如果你在if里面写的是return 程序到这个就结束了 两层循环都不会执行了 包括循环下面的代码也不会执行

Node.js 的异步机制由事件和回调函数实现,一开始接触可能会感觉违反常规,但习惯以后就会发现还是很简单的。然而这之中其实暗藏了不少陷阱,一个很容易遇到的问题就是循环中的回调函数,初学者经常容易陷入这个圈套。让我们从一个例子开始说明这个问题。

var fs = require('fs')

var files = ['a.txt', 'b.txt', 'c.txt']

for (var i = 0i <files.lengthi++) {

fs.readFile(files[i], 'utf-8', function (err, contents) {

console.log(files[i] + ': ' + contents)

})

}

这段代码的功能很直观,就是依次读取文件 a.txt、b.txt 、c.txt ,并输出文件名和内容。假设这三个文件的内容分别是 AAA 、BBB 和 CCC,那么我们期望的输出结果就是:

a.txt: AAA

b.txt: BBB

c.txt: CCC

可是我们运行这段代码的结果是怎样的呢?竟然是这样的结果:

undefined: AAA

undefined: BBB

undefined: CCC

这个结果说明文件内容正确输出了,而文件名却不对,也就意味着,contents 的结果是正确的,但 files[i] 的值是 undefined。这怎么可能呢,文件名不正确却能读取文件内容?既然难以直观地理解,我们就把 files[i] 分解并打印出来看看,在读取文件的回调函数中分别输出 files、i 和 files[i] 。

var fs = require('fs')

var files = ['a.txt', 'b.txt', 'c.txt']

for (var i = 0i <files.lengthi++) {

fs.readFile(files[i], 'utf-8', function (err, contents) {

console.log(files)

console.log(i)

console.log(files[i])

})

}

运行修改后的代码,结果如下:

[ 'a.txt', 'b.txt', 'c.txt' ]

3

undefined

[ 'a.txt', 'b.txt', 'c.txt' ]

3

undefined

[ 'a.txt', 'b.txt', 'c.txt' ]

3

undefined

看到这里是不是有点启发了呢?三次输出的 i 的值都是 3 ,超出了 files 数组的下标范围,因此 files[i] 的值就是 undefined 了。这种情况通常会在 for 循环结束时发生,例如 for (var i = 0i <files.lengthi++),退出循环时 i 的值就files.length 的值。既然 i 的值是 3 ,那么说明了事实上 fs.readFile 的回调函数中访问到的 i 值都是循环退出以后的,因此不能分辨。而 files[i] 作为 fs.readFile 的第一个参数在循环中就传递了,所以文件可以被定位到,而且可以显示出文件的内容。

现在问题就明朗了:原因是3 次读取文件的回调函数事实上是同一个实例,其中引用到的 i 值是上面循环执行结束后的值,因此不能分辨。如何解决这个问题呢?我们可以利用

JavaScript 函数式编程的特性,手动建立一个闭包:

//forloopclosure.js

var fs = require('fs')

var files = ['a.txt', 'b.txt', 'c.txt']

for (var i = 0i <files.lengthi++) {

(function (i) {

fs.readFile(files[i], 'utf-8', function (err, contents) {

console.log(files[i] + ': ' + contents)

})

})(i)

}

上面代码在 for 循环体中建立了一个匿名函数,将循环迭代变量 i 作为函数的参数传递并调用。由于运行时闭包的存在,该匿名函数中定义的变量(包括参数表)在它内部的函数(fs.readFile 的回调函数)执行完毕之前都不会释放,因此我们在其中访问到的 i 就分别是不同的闭包实例,这个实例是在循环体执行的过程中创建的,保留了不同的值。

补充:闭包的写法,无法保证按数组存放文件顺序读取文件内容,相当多个文件读取操作并行进行,根据文件大小决定读取的快慢;而forEach是可以的保证顺序读取

事实上以上这种写法并不常见,因为它降低了程序的可读性,故不推荐使用。大多数情况下我们可以用数组的 forEach 方法解决这个问题:

//callbackforeach.js

var fs = require('fs')

var files = ['a.txt', 'b.txt', 'c.txt']

files.forEach(function (filename) {

fs.readFile(filename, 'utf-8', function (err, contents) {

console.log(filename + ': ' + contents)

})

})