1

想请教大家一个问题:

  • 在循环里面, 单个循环好理解.
  • 一个循环里嵌套另一个循环, 测试输出结果, 能理解.
  • 一个循环里嵌套两个循环, 一共三层循环, 就蒙了.
  • 对于多层循环嵌套, 怎么才能达到: 一看代码, 就知道不同层级的变量是什么内容?

  1. 这里面有什么"思维技巧, 某个相关的概念" 能让人理解多层循环嵌套吗? 或者某种思维训练?
  2. 还是说相关代码写的多了就自然理解了?
  3. 对于循环和嵌套, 大家有什么独特的见解吗?

一直发现存在一个问题: php框架, 类库, 环境配置, php函数, 这些都相对容易理解. 反而对于一些基础东西不懂或懂得浅. 比如匿名函数, 闭包, 嵌套循环等等, 很慌.

jinz 55
2019-08-15 提问
5 个回答
1

把你觉得复杂的东西放到一个方法里面,如果还是觉得复杂,再提取,知道觉得不复杂为止。

代码重构的精髓所在。

0
  1. 我感觉只要选择的算法容易理解,那么代码也相对容易理解一些
  2. 如果再加上一些代码规范层面的就更好了。比如直观的变量名之类的
  3. 很简单的代码,都有人能给你写得晦涩难懂。相信我,这是我好几年代码review的经验。有些人的脑回路就是跟一般人不一样(这些人里有极少数是天才,但大部分都是蠢才)
  4. 至于你说的多层嵌套问题,也是一样的。先尝试理解他的算法,从他要解决的是什么问题,怎么解决的,这两个问题入手。理解了算法,剩下的应该就简单了
0

原则上一般不写超过3层循环的代码。o(n^3)是极限了。
写了那么久代码,也没遇到过需要3层以上循环的需求(通常就1层、2层比较多吧),如果有,那代码一定有优化空间。

0

像二维数组这样的,一般就会嵌套两个for循环去遍历。
至于博主所说的闭包,匿名函数等,像在js中是为了避免全局变量同名冲突的问题,
比如同一个页面引入了1.js,2.js,
1.js中有

var a = 1
setTimeout(function () {
    console.log(a)
}, 1000)

2.js中有

var a = 2
setTimeout(function () {
    console.log(a)
}, 1000)

那么在html页面先后引入的1.js和2.js,那么1.js和2.js中console.log打印的结果都只会是2

clipboard.png

因为2.js的a把1.js的a变量重新赋值为2,setTimeout是一个耗时操作,它不会被交给主线程去执行,而是放到异步队列中去了,所以html在加载1.js时,不会等1.js打印完成之后才去加载2.js,所以造成了1.js和2.js都打印的是2。
如果是团队开发中,很容易出现这种情况,开发人员1写1.js,开发人员2写2.js。
那么如何避免变量冲突的问题呢?

js采用了闭包来解决这个问题,这个也叫立即执行函数,写法有很多种,我只列举其中一种
重新定义1.js和2.js
1.js

(function () {
    var a = 1
    setTimeout(function () {
        console.log(a)
    }, 1000)
})()    // 先定义一个匿名函数,然后在末尾加上()来执行这个匿名函数。和平时调用函数方法一样,如a() ...

2.js

(function () {
    var a = 2
    setTimeout(function () {
        console.log(a)
    }, 1000)
})()

这样打印的结果就是正常了。

clipboard.png

如果想要在1.js或2.js暴露变量给其它js文件或者html页面使用,可以将window对象传入,比如

(function (win) {
    var a = 1
    win.b = '我是window下的一个全局变量'
    setTimeout(function () {
        console.log(a)
    }, 1000)
})(window)

这就是闭包的用法。

0

哈哈,递归是最深的嵌套;

怎么理解递归,就怎么理解嵌套

撰写答案

推广链接