
function makeIterator(array) { var nextIndex = 0; return { next: function() { return nextIndex < array.length ? {value: array[nextIndex++], done: false} : {value: undefined, done: true}; } }; } var it = makeIterator(['a', 'b']); it.next() // { value: "a", done: false } it.next() // { value: "b", done: false } it.next() // { value: undefined, done: true } 这段代码的功能是创建一个迭代器,但是有一点我想不通。 var it = makeIterator(['a', 'b']); 执行完这条语句之后, it 是一个对象,对象里面有一个 next 方法
{ next: function () { return nextIndex < array.length ? {value: array[nextIndex++], done: false} : {value: undefined, done: true}; } } 然后当执行 it.next()的时候,为什么这个方法可以访问 nextIndex 和 array 这两个值?按我的理解执行函数的时候只有通过参数才能传值,应该这样使用 it.next(nextIndex,array)才能执行函数才对? 我是一个 C 程序员,最近在学习 Javascript 。
1 ljcarsenal 2016-11-02 11:06:34 +08:00 执行 it.next() 返回一个对象啊 对象不是有 value 和 done 么 |
2 ljcarsenal 2016-11-02 11:08:35 +08:00 额 上面看错了。。。关键词 闭包 |
3 nickname 2016-11-02 11:21:15 +08:00 没写过 JS ,不过 LZ 可以类比 Java 迭代器实现,感觉原理差不多,可以看看这边博文 http://www.cnblogs.com/hasse/p/5024193.html |
4 iyangyuan 2016-11-02 11:34:08 +08:00 这就是闭包呀! 每一次调用 makeIterator ,变量 nextIndex 和 array 都会被分配在一个封闭的空间里,这个空间只有在 makeIterator 函数内部可见,并且此空间关联在当前调用的上下文中。 综上,最后的效果就是:每一次执行都会形成一个私有的上下文链,链可以自底向上层层访问,而不可以倒过来。 说白了就是变量私有化,有点多态的感觉。 个人浅见,仅供参考! |
5 zhuangzhuang1988 2016-11-02 11:36:48 +08:00 |
6 yujianwjj OP 查了闭包相关的知识,已经解决疑问,谢谢各位。 |
7 crashX 2016-11-02 14:51:04 +08:00 c 语法里有个 block ,跟那个类似。 |