请教一段 javascript 代码答疑

2016-11-02 11:03:52 +08:00
 yujianwjj
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 。

1992 次点击
所在节点    JavaScript
7 条回复
ljcarsenal
2016-11-02 11:06:34 +08:00
执行 it.next() 返回一个对象啊 对象不是有 value 和 done 么
ljcarsenal
2016-11-02 11:08:35 +08:00
额 上面看错了。。。关键词 闭包
nickname
2016-11-02 11:21:15 +08:00
没写过 JS ,不过 LZ 可以类比 Java 迭代器实现,感觉原理差不多,可以看看这边博文 http://www.cnblogs.com/hasse/p/5024193.html
iyangyuan
2016-11-02 11:34:08 +08:00
这就是闭包呀!
每一次调用 makeIterator ,变量 nextIndex 和 array 都会被分配在一个封闭的空间里,这个空间只有在 makeIterator 函数内部可见,并且此空间关联在当前调用的上下文中。
综上,最后的效果就是:每一次执行都会形成一个私有的上下文链,链可以自底向上层层访问,而不可以倒过来。
说白了就是变量私有化,有点多态的感觉。
个人浅见,仅供参考!
zhuangzhuang1988
2016-11-02 11:36:48 +08:00
yujianwjj
2016-11-02 11:38:29 +08:00
查了闭包相关的知识,已经解决疑问,谢谢各位。
crashX
2016-11-02 14:51:04 +08:00
c 语法里有个 block ,跟那个类似。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/317341

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX