javascript - 试图理解闭包。有人可以引导我完成这段代码吗?

标签 javascript closures

这里有一些来自 this reddit post 的 javascript :

function Stream() {
    var data       = [],
        listeners  = [];

    function push( new_data ) {
        var result = data.push( new_data );
        callListeners( new_data, result );
        return result;
    }

    function addListener( listener ) {
        return listeners.push( listener );
    }

    function callListeners( ) {
        var length    = listeners.length,
            result    = [],
            action    = null;
        while ( length-- ) {
            action = listeners[ length ];
            result.push( action.apply( null, arguments) );
        }
        return result;
    }

    return {
        push : push,
        addListener: addListener
    }

}


var foo = Stream();
foo.addListener( function( new_data ) {
    alert( "added: " + new_data );
});
foo.push( "Hello World!" );

我认为在阅读之后我对闭包的理解很脆弱 this tutorial ,但我无法弄清楚这段代码是如何工作的。当我试图在脑海中解析它时,我基本上卡在了第 6 行:var result = data.push(new_data);

data 似乎只是一个数组,此时 data.push( foo ) 没有意义。无论如何它不会无限递归吗?(打那个 - 不知道数组有一个原生的 push 方法)下一行 callListener 是用两个参数调用,但下面的函数没有。

如果有人有几分钟时间,您能拉着我的手,像我这个无知的傻瓜一样引导我完成这段代码吗?现在,我什至不确定我是否了解目的地。

最佳答案

数组对象,它们有一个push()方法。那里没有什么异常。

callListeners() 函数不声明任何命名参数,但 JavaScript 允许调用函数时使用的参数多于它们声明的参数,完整的参数列表可作为特殊名称 argumentscallListeners()action.apply() 调用中使用 arguments,以相同的方式调用 action 函数callListeners() 本身给出的参数列表。 callListeners() 的目的是用一些参数调用它,然后它用这些参数调用 listeners 数组中的所有函数。

不过,这些都与闭包的使用无关。闭包发挥作用的地方是 Stream() 返回的对象有两个方法,push()addListener(),即可以“看到”相同的 datalisteners 数组,即使这些数组没有存储在调用方法的对象中。两次调用 Stream() 将返回两个对象,它们的方法看到不同 datalisteners 数组。

关于javascript - 试图理解闭包。有人可以引导我完成这段代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5799584/

相关文章:

javascript - 如何使用 Polymer 1.0 中的行为来模仿 Polymer 0.5 中的扩展

javascript - umbraco 轮廓检查是否选中复选框

objective-c - 将 Swift 2 闭包转换为 Objective-C block

javascript - 将闭包传递给 Jquery $.each

javascript - 扫雷炸弹威胁

javascript - 弹跳效果不起作用。导致它不起作用的背景图像?

javascript - Angular、ng-href 导致页面刷新

javascript - 始终获取数组中的最后一项,我需要 JavaScript 闭包吗?

powershell - 如何将 .GetNewClosure() 与 EngineEvent 的 -Action 值一起使用

javascript - 在解析时定义封闭函数?