在Ajax BBS上看到了这么一段代码:
<script>
Function.prototype.$bind=function(object)
{
var callback = function () {
   return arguments[0];
}
with(object)
{
   return eval('callback(' + this.toString() + ')');
}
}

var obj={a:1,b:2};
var f=function (){
a=10;
b=11;
}.$bind(obj);

f();
alert(obj.a);
</script>

结果为10~

试着尝试说下原理:
this.toString()返回的是函数体,在例子中也就是function (){
a=10;
b=11;
}。
在bind方法中使用了with,则把指针指向了object,而不是window,这时候调用a = 10实际上是object.a = 10;
开始我觉得callback多此一举,直接使用eval(this.toString());就可以,不过在IE下报错,在FF下是可以得到正确结果的。
那么这callback就是用来解决ie下报错的问题。
检查了半天才发现报错是因为bind以后并没有返回一个function,callback就是把这个function返回。
得到猜想:在IE下调用eval,不调用return,不会有返回值。而FF下,默认会返回最后的结果。
那么开始证明这个猜想:

调用:
alert(eval('333'));
都会弹出333

调用:
eval('function(){alert(3)}')()
IE下报错,FF下会弹出3。

调用:
alert(eval('function(){alert(3)};a = 3'));
IE下FF下都会弹出3,FF下弹出3.

所以说明上面的猜想是错误的。
也就是IE下调用eval的时候,普通的表达式则会返回,若得到一个function,是不会返回的。