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 1
额 上面看错了。。。关键词 闭包
|
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 ,跟那个类似。
|