在JavaScript中yield实用简便实现方法[网站编程]
本文“在JavaScript中yield实用简便实现方法[网站编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
原认为是一个蛮复杂的标题,想了好久没思绪,当然要实现绝对能实现,但假如解析JavaScript脚本或是动态产生代码,都太复杂了.
方才忽然灵机一动,迭代器我们很少会真的直接傻乎乎的next去遍历的,那为什么一定要实现这个傻乎乎的next呢?直接实现each,这样,这样反过来,Yeah,一通百通,不一会儿就写出了第一个超简便版本:
代码
functionyieldHost(yieldFunction)
{
returnfunction(processer)
{
varyield=function(result)
{
processer(result)
};
yieldFunction(yield);
};
}
思绪一换,代码真简便.
先附上例子,然后来谈原理.
首先我们需求一个函数来举行列举,像这样:
functionfun(yield)
{
for(vari=0; i<100; i++)
yield(i);
}
或是这样:
functionfun(yield)
{
yield(1);
yield(2);
yield(3);
}
由于实现方法与C#的差别,所以在循环体内也不用什么yield break或是yield continue这样的语法,直接break或是continue就行了.
然后是实际的应用,yieldHost函数可以将上面的符合要求的fun函数转换为一个列举器:
varenumerator=yieldHost(fun);
这个列举器其实也是一个函数,像jQuery的each函数一样,接纳一个处理函数来处理列举:
enumerator(function(item)
{
window.alert(item);
});
接下来谈谈原理.
关于传统的列举器来说,我们会认为列举器应当在每次调用返回一个值,这就是next办法,但就像陈子瀚说的,这需求在yield的时刻把函数愣住,固然可以实现,但真的很麻烦.
但!事实上我发现,大大都时刻,我们都是用foreach这样的语法来拜候列举器的.这样一来就给了我一个非常讨巧的办法,不实现next办法,而是实现each办法.
each办法和next的办法的辨别在那边呢?熟习jQuery的朋友就会知道,each办法其实可以视为将next倒过来,不是返回列举值,而是接纳一个函数,把列举值当作参数传进去.
恰是这一倒,全部问题都迎刃而解了.我们没有必要去暂停一个函数的履行,只需求将处理列举值的逻辑注到这个函数里面去就完了.所以事实上这里的yieldHost就是完成了一个倒装的工作,把enumerator接纳的那个函数(也就是window.alert( item ),注到了列举函数中(即fun).终究履行的效果就像是这样:
functionfun(yield)
{
window.alert(1);
window.alert(2);
window.alert(3);
}
所以就诞生了这个超简便的实现.
以上是“在JavaScript中yield实用简便实现方法[网站编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |