1
wong2 2012-09-29 17:55:28 +08:00 1
我是这样理解的:
一开始: MYAPP --> {} parent = MYAPP执行之后: MYAPP --> {} <-- parent 循环一次之后: MYAPP --> { module1: {x:1} <-- parent } 循环两次之后: MYAPP --> { module1: { x:1, module2: { x:2 } <-- parent } } 依次类推 如果在for里把parent改写成MYAPP,`MYAPP = MYAPP[parts[i]]` 执行时会造成MYAPP被覆盖掉,不再指向最外层的对象。。 |
3
bigmusic OP 已解决,这并不是一个简单的相等引用的问题,因为循环中的指针parent不断改变,而MYAPP这个指针是没有变的,我的理论没有错,这里只是两个指针,一个全局不变,一个局部随循环改变的不同
parent在第一次循环指向MYAPP.module1,第二次循环指向MYAPP.module1.module2,第三次指向MYAPP.module1,module2.module3 可以在循环内加上console检测parent.x的变化观察之 这是一个脑子不够用的逻辑问题.....我恨我不是谢耳朵,可以继续DOMBOM了 |
5
binux 2012-09-29 18:24:30 +08:00
「在for循环里我把parent改写成MYAPP会得到完全不同的结果」
不同的结果又是什么?你想得到什么样的结果? |
6
bigmusic OP @binux
如果换成MYAPP,你会得到MYAPP={x:3}的结果如果我没记错,因为MYAPP的指针被覆盖了 再有,我提的这个问题也是不成立的,将var parent=MYAPP;搬到全局对结果没影响,这只是两个指针的戏法而已~ |
7
chone 2012-09-29 19:16:13 +08:00 1
在javascript里这个东西叫引用,其实就是指针的概念。基本类型String, Number, Boolean之类以外的复杂类型赋值操作传递的都是引用。
parent变量保存的只是MYAPP的引用,用而不是对象本身。 循环中的操作 parent = parent[parts[i]]; 只是把parent指向的对象从MYAPP变为一个新的对象,MYAPP自然不会改变。C中指针不也是这样的么? 要是parent改变会引起MYAPP那就是值传递了。 |
8
binux 2012-09-29 21:42:03 +08:00
|
9
bigmusic OP @binux 在js中,对象的引用只能用指针来理解
这里操纵不是MYAPP,而是parent这个指针指向MYAPP里面不同的对象 |
10
bigmusic OP @chone
都怪我脑袋不好使,被两个指针搞晕了...这是逻辑思维的问题,现在清晰多了,之前理解不了老怕自己对引用指针理解错误,奇怪问了两个做前端的都答不出来.._-_ |
11
binux 2012-09-30 01:19:05 +08:00
@bigmusic 如果你「在for循环里我把parent改写成MYAPP」而产生MYAPP={x:3}的结果,原因只是简单地MYAPP的值被改变了罢了,这里根本不需要考虑什么对象,即使每次都产生新的拷贝,结果还是一样的。
嘛,主要原因还是「在for循环里我把parent改写成MYAPP」这样的改法并不能揭示对象/引用这样的概念,与你的目的不符。 |