这里有一些来自 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 允许调用函数时使用的参数多于它们声明的参数,完整的参数列表可作为特殊名称 arguments
。 callListeners()
在 action.apply()
调用中使用 arguments
,以相同的方式调用 action
函数callListeners()
本身给出的参数列表。 callListeners()
的目的是用一些参数调用它,然后它用这些参数调用 listeners
数组中的所有函数。
不过,这些都与闭包的使用无关。闭包发挥作用的地方是 Stream()
返回的对象有两个方法,push()
和 addListener()
,即可以“看到”相同的 data
和 listeners
数组,即使这些数组没有存储在调用方法的对象中。两次调用 Stream()
将返回两个对象,它们的方法看到不同 data
和 listeners
数组。
关于javascript - 试图理解闭包。有人可以引导我完成这段代码吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5799584/