V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
yujianwjj
V2EX  ›  JavaScript

请教一段 javascript 代码答疑

  •  
  •   yujianwjj · 2016-11-02 11:03:52 +08:00 · 2140 次点击
    这是一个创建于 2949 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 。

    7 条回复    2016-11-02 14:51:04 +08:00
    ljcarsenal
        1
    ljcarsenal  
       2016-11-02 11:06:34 +08:00
    执行 it.next() 返回一个对象啊 对象不是有 value 和 done 么
    ljcarsenal
        2
    ljcarsenal  
       2016-11-02 11:08:35 +08:00   ❤️ 1
    额 上面看错了。。。关键词 闭包
    nickname
        3
    nickname  
       2016-11-02 11:21:15 +08:00
    没写过 JS ,不过 LZ 可以类比 Java 迭代器实现,感觉原理差不多,可以看看这边博文 http://www.cnblogs.com/hasse/p/5024193.html
    iyangyuan
        4
    iyangyuan  
       2016-11-02 11:34:08 +08:00
    这就是闭包呀!
    每一次调用 makeIterator ,变量 nextIndex 和 array 都会被分配在一个封闭的空间里,这个空间只有在 makeIterator 函数内部可见,并且此空间关联在当前调用的上下文中。
    综上,最后的效果就是:每一次执行都会形成一个私有的上下文链,链可以自底向上层层访问,而不可以倒过来。
    说白了就是变量私有化,有点多态的感觉。
    个人浅见,仅供参考!
    yujianwjj
        6
    yujianwjj  
    OP
       2016-11-02 11:38:29 +08:00
    查了闭包相关的知识,已经解决疑问,谢谢各位。
    crashX
        7
    crashX  
       2016-11-02 14:51:04 +08:00
    c 语法里有个 block ,跟那个类似。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5566 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:39 · PVG 16:39 · LAX 00:39 · JFK 03:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.