javascript实现yield

本文介绍了一种在Internet Explorer中实现迭代器的方法,通过使用eval函数解决IE对Function表达式的兼容性问题,并展示了如何利用该技巧实现Array.prototype.forEach方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

没想到代码一次测试成功.~~只不过是FF下面,修改一下支持IE了。由于IE不认function表达式.

 

 

 

ExpandedBlockStart.gifContractedBlock.gifvar Iterator = function (fn) {
    
var coroutine = null;
    
var cofn_this = null;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
var yield = function() {
        coroutine.apply(cofn_this, arguments);
    }

    
// support IE.
    // NOTE: IE eval("function(){}") does not return a function object.
    eval('fn = ' + fn.toString());
ExpandedSubBlockStart.gifContractedSubBlock.gif    
return function(cofn, cothis){
        coroutine 
= cofn;
        cofn_this 
= cothis;
        
return fn.apply(this)
    }
;
}


ExpandedBlockStart.gifContractedBlock.gifArray.prototype.forEach 
= new Iterator(function () {
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for (var i = 0; i < this.length; i ++{
        yield(
this[i])
    }

}
);
// example.
this.display = window.alert;

var A = [1,2,3,4,5];
ExpandedBlockStart.gifContractedBlock.gifA.forEach(
function(it){
    
this.display(it)
}
this);

 

 其中有一个技巧:

fn = eval(fn.toString())

用于将fn中的引用绑定到当前的上下文中,这样fn中的yield才会引用到我们定义的yield函数。

 

注意一下,如果你需要在coroutine里访问其他this上下文,需要向iterator传递进去, 如 example.

转载于:https://www.cnblogs.com/hackwaly/archive/2008/07/27/1252617.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值